1

需要一些帮助来找出从这种查询中有效获取结果的最佳方法,我有一个消息表,这个消息表对每个消息都有评论。我需要检索每条消息以及该消息的每个后续评论。起初我想获取所有消息及其 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
4

3 回答 3

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
于 2013-02-16T13:34:53.423 回答
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

于 2013-02-16T14:01:56.040 回答
0

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

在没有使用上下文的情况下,你可以用任何一种方式争论这一点。

要看的东西,是。

您是否总是想获取所有数据?

您是否需要所有数据,然后才能使用它做下一件事情。

往返的费用是多少?

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

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

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

简而言之,高效在什么方面?

于 2013-02-16T13:58:02.170 回答