首先,抱歉我的英语不好......
我的一个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
是否可以为此任务进行一次查询?
答案 0 :(得分:3)
“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
答案 1 :(得分:1)
对于一个查询,您希望在迭代结果时获取消息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;
我不确定这是不是你正在寻找的东西,但这可以让你开始。