需要一些帮助来找到有效地从这种查询中获得结果的最佳方法,我有一个消息表,这个消息表对每个消息都有注释。我需要检索每条消息以及消息的每个后续评论。起初我想抓住所有的消息和他们的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 :(得分: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);
答案 2 :(得分:0)
最佳选择是通过连接在一次往返中获取所有数据,而不是多次往返的开销到较少量的数据。
如果没有使用上下文,你可以论证这一点。
要看的东西是。
您是否一直想获取所有数据?
在您可以使用它做下一件事之前,您是否需要所有数据?
往返的费用是多少?
获得这一切的成本是多少?
一旦你有了缓存数据(例如延迟加载是有用的)。你需要猜测数据的易变性,即。缓存过时的可能性有多大,请记住,一次性获取所有数据都是一个很大的缓存。
你可能会选择低效率来表达UI响应能力。考虑用客户名称填充组合,然后在选择时显示它的属性。 但是,如果是一个网页,即使像ajax这样的东西往返也可能会很痛苦。
那么总之,在什么方面有效?