从几个表中加速SELECT

时间:2011-11-01 08:05:24

标签: php mysql sql select

我需要加快一个SQL查询。或者更好地处理php代码。搜索数据库并在前端显示结果时的一些最佳实践。

基本上我有三张桌子   - 包含记录的方框   - 包含歌曲的记录   - 歌曲

我希望我的前端代码列出如下内容:

Box 1
 -Record 1
  --Song 1
  --Song 2
    etc....
 -Record 2
  --Song 1
  --Song 2
    etc....
Box 2
 -Record 1
  --Song 1
  --Song 1
etc. etc. etc.

“我的方式”非常耗时:

  1. 我使用标准SQL搜索“Box”表。
  2. 对于每一行,我调用一个函数来查找该框的每条记录
  3. 对于每条记录,我调用一个函数来查找该记录的每首歌
  4. 由于选择的电话数量巨大(很多箱子,很多都是),所以需要很长的时间才能完成。

    我想有一种更简单的方法(从服务器的尖端视图)来做同样的事情。将dato拉到php数组以及那里的逻辑或其他聪明的东西。

    问题: 使用php从关系数据库获取数据的最佳实践是什么?

    溴。安德斯

2 个答案:

答案 0 :(得分:3)

您需要了解JOIN s。在这里,您将使用两个外连接。这样,只使用一个选择查询就可以获得相同的结果,PHP和MySQL必须完成的工作量要少得多。

您的SQL看起来像这样:(请注意,我使用SELECT *作为真实列列表的替身,因为我不知道您拥有哪些列 - 使用SELECT *通常不是一个好主意)

SELECT
    *
FROM
    Box
    LEFT JOIN Record ON Box.BoxID = Record.BoxID
    LEFT JOIN Song ON Record.RecordID = Song.RecordID

答案 1 :(得分:2)

基于单一集合的选择操作将比许多基于单行的选择更快。

使用连接实现此目的 见:http://en.wikipedia.org/wiki/Join_(SQL

我不知道你的数据库结构,所以这不是一个有效的例子, 这里是如何返回特定盒子的所有歌曲。

SELECT s.* FROM box b
INNER JOIN record r ON r.box_id = b.box_id
INNER JOIN song s ON s.record_id = r.record_id
WHERE box.name = 'mybox'

会比以下更快:

select from box b
   where box.name = 'mybox'
LOOP
  select record_id from record 
  LOOP
      select * from song
  END 
END
相关问题