循环中的子查询

时间:2013-02-16 13:20:35

标签: php mysql sql pdo

需要一些帮助来找到有效地从这种查询中获得结果的最佳方法,我有一个消息表,这个消息表对每个消息都有注释。我需要检索每条消息以及消息的每个后续评论。起初我想抓住所有的消息和他们的PK,然后在循环中使用它来获取评论,但我想知道是否有更有效的方法来做到这一点。我希望每条消息都与该消息的所有后续评论一起显示。 Message1 - >所有评论Message2 - >所有评论。 这是我希望输出如何的示例:

eg.    Work Site Maintenance.  //Message
               At 1pm          //comments
               At 2pm          //comments
               At 3pm          //comments
         Work Site Offline.
               Foundation work
               Layng blocks
               Placing steel

我当前的查询是获取消息列表而不是每个

的评论
SELECT MS.status_id,
       MS.member_id,
       MS.status_text,
      MS.status_time
    FROM message_status MS
    WHERE MS.member_id = memberId //variable
    ORDER BY MS.status_id DESC 
    LIMIT 20


**message_status**
status_id PK
member_id
status_text
status_time

**comments_status**
status_id FK
member_id FK
comm_text
comm_time

3 个答案:

答案 0 :(得分:2)

我认为你可以加入他们以获得你想要的结果。

SELECT MS.status_id,
   MS.member_id,
   MS.status_text,
   MS.status_time,
   CS.comm_text,
   CS.comm_time
FROM message_status MS
  left join comments_status CS on CS.status_id = MS.status_id
WHERE MS.member_id = memberId //variable
ORDER BY MS.status_id DESC, CS.comm_time DESC
LIMIT 20

答案 1 :(得分:1)

如何使用LEFT JOIN

SELECT MS.status_id,
       MS.member_id,
       MS.status_text,
       CS.comm_text,
      MS.status_time
    FROM message_status MS
    LEFT JOIN (SELECT * FROM comments_status) AS CS
    USING (status_id,member_id)
    WHERE MS.member_id = memberId //variable
    ORDER BY MS.status_id DESC 
    LIMIT 20;

此外,索引WHERE和JOIN子句中的列应该加快SELECT查询(但是减慢了INSERT,所以如果你经常执行这个查询,这只是值得的权衡):

CREATE INDEX m_id ON message_status (member_id);
CREATE INDEX sm_id ON message_status (status_id,member_id);
CREATE INDEX sm_id ON comments_status (status_id,member_id);

示例:http://sqlfiddle.com/#!2/565f9/1

答案 2 :(得分:0)

最佳选择是通过连接在一次往返中获取所有数据,而不是多次往返的开销到较少量的数据。

如果没有使用上下文,你可以论证这一点。

要看的东西是。

您是否一直想获取所有数据?

在您可以使用它做下一件事之前,您是否需要所有数据?

往返的费用是多少?

获得这一切的成本是多少?

一旦你有了缓存数据(例如延迟加载是有用的)。你需要猜测数据的易变性,即。缓存过时的可能性有多大,请记住,一次性获取所有数据都是一个很大的缓存。

你可能会选择低效率来表达UI响应能力。考虑用客户名称填充组合,然后在选择时显示它的属性。 但是,如果是一个网页,即使像ajax这样的东西往返也可能会很痛苦。

那么总之,在什么方面有效?