[英]Advanced JOIN Query in MySQL?
首先,抱歉我的英语不好......
我的一个MySQL查询有问题。 我有两张桌子:消息和回复。 消息表包含id,discussion_id,content和date字段。 回复表包含id,message_id,content和date字段。
我想在一个特定的讨论中获取最新的十条消息及其回复。 消息需要在最后一个回复中排序,回复需要先排序。
(喜欢Facebook)
我可以这样做:
SELECT * FROM messages WHERE discussion_id = 'test' ORDER BY date DESC;
然后使用PHP foreach循环
SELECT * FROM replies WHERE message_id = 'test' ORDER BY date ASC;
但是,如果我使用我的11个查询,这是不理想的。 我正在考虑加入或联合,但如果我这样做,回复和消息就不可分离了。 该列表按replies.date排序,但回复及其父消息不再在一起。 我正在使用这个:
SELECT * FROM messages LEFT JOIN replies ON messages.id = replies.message_id WHERE discussion_id='4cc43b40586b6' ORDER BY replies.date DESC
是否可以为此任务进行一次查询?
那么'IN'关键字怎么样? 您可以将其减少为总共两个查询,因为您希望将回复与消息分开。 第一个查询已经很好了,但对于第二个查询,(我还没有针对数据库检查过这个问题,所以语法可能稍微偏离):
SELECT *
FROM replies
WHERE message_id IN (
SELECT message_id
FROM messages
WHERE discussion_id = 'test'
)
ORDER BY date ASC;
编辑(根据评论中的建议):
您还可以修改上面的连接以提高性能; 它仍然总共给你两个查询,但你还是想要两组结果:
SELECT *
FROM replies
LEFT JOIN messages ON messages.id = replies.message_id
WHERE discussion_id='4cc43b40586b6'
ORDER BY replies.date ASC
对于一个查询,您希望在迭代结果时获取消息ID和回复ID,并在那里对它们进行排序。 否则,您需要更多查询。
SELECT
messages.id AS messageid,
replies.id AS replyid,
*WHATEVER OTHER COLUMNS*
FROM replies, messages
WHERE replies.message_id = messages.discussion_id
AND messages.discussion_id = 'test'
ORDER BY replies.date ASC;
我不确定这是否是你正在寻找的东西,但这可以让你开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.