MySql在主查询中使用group by对子查询进行排序

时间:2018-05-18 22:41:03

标签: mysql subquery

我正在为我的网站开发一个简单的消息系统。这是消息表如何工作的图像:

Picture of the MySql table

我想到的是使用子查询,然后使用GROUP BY只获取发送给每个人的最后一条消息,在本例中是用户1.这是第一个查询:

SELECT m.user_id as user_id, u.username as username, u.avatar as avatar, m.message_id as messsage_id, m.message as message, m.date as read_date 
FROM users_messages m 
INNER JOIN users u 
ON u.user_id = m.sender_id 
WHERE m.receiver_id = 1 
ORDER BY message_id DESC

某些数据来自另一个表,但它并不相关。此查询返回此结果,该结果是预期的:

Image with the results of the first query

我将消息描述为描述性的,这样您就可以更清楚地看到发生了什么。现在,这里出现了奇怪的部分。如您所见,消息按消息ID排序,因此注释从新到旧排序。一切都很好。但是,当我取消以下查询...

SELECT q.user_id, q.username, q.avatar, q.message, q.read_date
FROM (SELECT u.user_id as user_id, u.username as username, u.avatar as avatar, m.message_id as messsage_id, m.message as message, m.date as read_date 
      FROM users_messages m 
      INNER JOIN users u 
      ON u.user_id = m.sender_id
      WHERE m.receiver_id = 1 
      ORDER BY message_id DESC) AS q
GROUP BY user_id

这应该按用户对消息进行分组,因此只显示第一个消息(在这种情况下是最新的消息)。但事实并非如此。它总是为每个人返回第一条消息,如下图所示:

Picture with the results that make no sense

我真的非常,对此感到困惑,我无法找到任何有助于我解决问题的方法。

1 个答案:

答案 0 :(得分:0)

问题在于moduleB,它会从您提供的集合中选择任意结果。我认为您应该能够通过更改第一个查询来获得所需的结果:

app