我想要列出从其他用户接收特定用户的消息,按ID分组,并按收到的最后一条消息排序。
如果我使用这个查询:
SELECT MAX(id), fromid, toid, message
FROM pro_messages
WHERE toid=00003
GROUP BY fromid我没有收到从用户"fromid“发送到用户"toid”的最后一条消息,但发送的是第一条消息。我可以用其他方式来做吗?或者我需要用两个查询或连接表来做?
id -消息id fromid -发送消息的用户的id -接收消息的用户的id (在本例中为用户00003)
发布于 2010-03-13 11:30:13
首先,您需要小心处理那里的toid值。如果将其解释为八进制数,则填充零可能会带来麻烦:00010是9位十进制,而toid=9很可能不是您想要的。
至于您的消息问题,您在MySQL中获得了组操作员的正常行为。考虑以下简化表:
mysql> select * from messages;
+------+--------+------+---------+
| id | fromid | toid | message |
+------+--------+------+---------+
| 1 | 100 | 3 | hi |
| 2 | 100 | 3 | there |
| 3 | 100 | 3 | how |
| 4 | 101 | 3 | did |
| 5 | 100 | 3 | are you | <--the message you want, right?
+------+--------+------+---------+在fromid上进行分组时,数据库会将符合分组条件的所有行折叠为一行。在这种情况下,您的查询将获得以下结果
mysql> select max(id), fromid, toid, message from messages where toid=3 group by fromid;
+---------+--------+------+---------+
| max(id) | fromid | toid | message |
+---------+--------+------+---------+
| 5 | 100 | 3 | hi |
| 4 | 101 | 3 | did |
+---------+--------+------+---------+注意,现在'100‘行的最大值(Id)是5,但是来自id=1的消息。这就是GROUP BY操作的工作方式。您不能用一个简单的查询来解决这个问题,但是如果您切换到如下所示的子选择,您将获得正确的结果:
mysql> select id, fromid, toid, message from messages where id in (select max(id) from messages where toid=3 group by fromid);
+------+--------+------+---------+
| id | fromid | toid | message |
+------+--------+------+---------+
| 4 | 101 | 3 | did |
| 5 | 100 | 3 | are you |
+------+--------+------+---------+https://stackoverflow.com/questions/2436691
复制相似问题