MySQL中的高级JOIN查询?

时间:2010-11-29 15:25:18

标签: php mysql join

首先,抱歉我的英语不好......

我的一个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

是否可以为此任务进行一次查询?

2 个答案:

答案 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;

我不确定这是不是你正在寻找的东西,但这可以让你开始。