我正在为我的网站开发一个简单的消息系统。这是消息表如何工作的图像:
我想到的是使用子查询,然后使用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
我真的非常,对此感到困惑,我无法找到任何有助于我解决问题的方法。
答案 0 :(得分:0)
问题在于moduleB
,它会从您提供的集合中选择任意结果。我认为您应该能够通过更改第一个查询来获得所需的结果:
app