首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql order by问题

问MySql order by问题
EN

Stack Overflow用户
提问于 2010-03-13 08:14:44
回答 1查看 113关注 0票数 0

我想要列出从其他用户接收特定用户的消息,按ID分组,并按收到的最后一条消息排序。

如果我使用这个查询:

代码语言:javascript
复制
SELECT MAX(id), fromid, toid, message 
  FROM pro_messages 
 WHERE toid=00003 
GROUP BY fromid

我没有收到从用户"fromid“发送到用户"toid”的最后一条消息,但发送的是第一条消息。我可以用其他方式来做吗?或者我需要用两个查询或连接表来做?

id -消息id fromid -发送消息的用户的id -接收消息的用户的id (在本例中为用户00003)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-13 11:30:13

首先,您需要小心处理那里的toid值。如果将其解释为八进制数,则填充零可能会带来麻烦:00010是9位十进制,而toid=9很可能不是您想要的。

至于您的消息问题,您在MySQL中获得了组操作员的正常行为。考虑以下简化表:

代码语言:javascript
复制
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上进行分组时,数据库会将符合分组条件的所有行折叠为一行。在这种情况下,您的查询将获得以下结果

代码语言:javascript
复制
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操作的工作方式。您不能用一个简单的查询来解决这个问题,但是如果您切换到如下所示的子选择,您将获得正确的结果:

代码语言:javascript
复制
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 | 
+------+--------+------+---------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2436691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档