首先,您需要小心您的toid 值。如果将其解释为八进制数,则零填充可能会导致问题:00010 是十进制数 9,toid=9 很可能不是您想要的。
至于您的消息问题,您在 MySQL 中获得了 GROUP 运算符的正常行为。考虑下面的简化表:
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”行的 max(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 |
+------+--------+------+---------+