2013-02-16 80 views
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 
+0

所以'工作网站Maintenance'部分应是预期的结果? – scones 2013-02-16 13:23:27

+0

是否正确,是否希望以该格式显示,然后选择工作站点维护与此消息关联的注释。 – kabuto178 2013-02-16 13:25:11

+0

评论和消息如何相关?从你上面的结构来看,似乎并不是。 – Kermit 2013-02-16 13:34:36

回答

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 
+0

我建议左侧加入评论,以防某些消息没有。 – 2013-02-16 13:36:07

+0

良好的通话,修复。 – wtjones 2013-02-16 13:36:43

+0

现在就试试看,感谢看 – kabuto178 2013-02-16 13:48:01

0

的最优选择是让所有的数据在一个往返与加盟相对于往返的开销,很多情况下数据量较小。

没有使用上下文,你可以争论这种方式。

要看的东西是。

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

在你做下一件事情之前,你是否需要所有的数据?

往返旅程的费用是多少?

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

缓存数据一旦你有(例如延迟加载是有用的)。你需要猜测数据是多么的不稳定,也就是说。缓存过期的可能性有多大,请记住一次获取所有数据是一个很大的缓存。

这很可能是你可能选择效率低下来说的UI响应。考虑填写客户名称的组合,然后在选择时显示其属性。 但是如果是一个网页,即使有类似ajax的东西往返也可能会很痛苦。

那么总之,高效什么?

+0

感谢您的洞察力,这些数据将会每天更新,并且会员会在一天中多次访问。在请求时,消息必须显示相关的注释。如果需要进行额外的更改,获取此数据可能会阻止继续执行步骤。不确定费用,但文本字段是(VARCHAR 180) – kabuto178 2013-02-16 14:06:04

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