MySql按顺序排序

时间:2010-03-13 00:14:44

标签: mysql

我想列出按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)

1 个答案:

答案 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 | 
+------+--------+------+---------+