我想列出按ID收到其他用户组中特定用户的邮件,并按收到的最后一条邮件排序。
如果我使用此查询:
SELECT MAX(id), fromid, toid, message
FROM pro_messages
WHERE toid=00003
GROUP BY fromid
我没有收到用户“fromid”发送给用户“toid”的最后一条消息,但是发送了第一条消息。我可以通过其他方式执行此操作,还是需要使用两个查询或连接表来执行此操作?
id - 消息ID fromid - 发送消息的用户的id toid - 接收消息的用户的ID(在本例中为用户00003)
答案 0 :(得分:1)
首先,您需要注意那里的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 |
+------+--------+------+---------+