主查询中带有group by的MySql排序子查询

主查询中带有group by的MySql排序子查询,mysql,subquery,Mysql,Subquery,我正在为我的网站开发一个简单的消息系统。下面是messages表工作原理的图像: 我想到的是使用子查询,然后使用GROUPBY只获取发送给用户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表工作原理的图像:

我想到的是使用子查询,然后使用GROUPBY只获取发送给用户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
SELECT u.user_id as user_id, u.username as username, u.avatar as avatar, m.message_id as message_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 AND 
  m.message_id = (SELECT MAX(message_id) 
                  FROM users_messages m1 
                  WHERE m1.sender_id = u.user_id)
有些数据来自另一个表,但并不相关。此查询将返回以下结果:

我对这些信息进行了描述,这样你就能更清楚地看到发生了什么。现在,奇怪的部分来了。如您所见,消息是按消息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
这将按用户对消息进行分组,因此只显示第一条消息(本例中的最新消息)。然而,事实并非如此。它总是为每个人返回第一条消息,如下图所示:


我真的,真的很困惑,我找不到任何可以帮助我修复它的东西。

问题在于
分组依据
,它从您提供的集合中选择任意结果。我认为通过更改第一个查询,您应该能够得到想要的结果:

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
SELECT u.user_id as user_id, u.username as username, u.avatar as avatar, m.message_id as message_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 AND 
  m.message_id = (SELECT MAX(message_id) 
                  FROM users_messages m1 
                  WHERE m1.sender_id = u.user_id)

没有照片,谢谢。谢谢你,你救了我!!我还是个新手,不知道MAX()函数。不用担心,很高兴能帮上忙。