繁体   English   中英

MySQL中的高级JOIN查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM