Mysql 如何通过x DESC查询分组

Mysql 如何通过x DESC查询分组,mysql,sql,group-by,sql-order-by,Mysql,Sql,Group By,Sql Order By,下面的SELECT语句 select * from messages where receiverID = '5' group BY senderID order by id DESC 数据库: id | senderID | receiverID | message 1 | 245 | 5 | test 1 2 | 89 | 5 | test 2 3 | 79 | 5 | test 3 4

下面的SELECT语句

select * 
from messages 
where receiverID = '5' 
group BY senderID 
order by id DESC
数据库:

id | senderID | receiverID | message
1  |  245     |    5       | test 1
2  |  89      |    5       | test 2
3  |  79      |    5       | test 3
4  |  245     |    5       | test 4
5  |  245     |    5       | test 5
对于senderID=245,我希望返回id=5的行,但它没有返回id=1的行,但我想要最后一行。如何做到这一点

返回:

id | senderID | receiverID | message
1  |  245     |    5       | test 1
2  |  89      |    5       | test 2
3  |  79      |    5       | test 3

哦,我做到了:D

这就是代码,对于任何有类似问题的人来说都是有效的

     SELECT * FROM ( SELECT * FROM messages WHERE
 receiverID = '5' ORDER BY id DESC) AS m GROUP BY senderID ORDER BY id DESC

这是不可能的。您必须执行以下操作:

[...] WHERE `id` = (SELECT MAX(`id`) FROM `messages` WHERE `receiverID` = '5')

这是不可能的。您必须执行以下操作:

[...] WHERE `id` = (SELECT MAX(`id`) FROM `messages` WHERE `receiverID` = '5')

我不确定我是否完全理解你的问题,但我觉得你想要:

select max(id), 
       senderId, 
       max(receiverId), 
       max(message)
from messages 
where receiverID = '5' 
group BY senderID 
order by id DESC

请注意,您还需要将消息包含到聚合中,否则您将得到无法预测的结果(其他DBMS不允许省略
max(message)
,但MySQL将从组中随机返回一行)。

我不确定是否完全理解您的问题,但听起来您想要:

select max(id), 
       senderId, 
       max(receiverId), 
       max(message)
from messages 
where receiverID = '5' 
group BY senderID 
order by id DESC

注意,你也需要把消息包含到你的聚合中,否则你会得到不可预知的结果(其他DBMS不允许删除<代码> max(消息)< /代码>,但是MySQL只会从组中返回一个随机行)。

SELECT messagesOrdered.*
FROM (
  SELECT * 
  FROM messages 
  WHERE receiverID = '5' 
  ORDER BY id DESC
) AS messagesOrdered
GROUP BY senderID
您可能希望根据表的大小检查设置了哪些键


使用MAX的问题是,如果在
id
字段中使用MAX,则它将获得您要查找的号码,但是在另一个字段中使用MAX不会获得与该id匹配的数据。使用子查询方法,内部查询正在进行排序,然后外部的组将根据内部查询中的行的顺序来分组。

< P>我个人会考虑一个子查询,沿着这条线的一些事情应该为您做< /P>的工作。
SELECT messagesOrdered.*
FROM (
  SELECT * 
  FROM messages 
  WHERE receiverID = '5' 
  ORDER BY id DESC
) AS messagesOrdered
GROUP BY senderID
SELECT * FROM messages m
JOIN 
( SELECT senderID, MAX(id) AS last
  FROM messages 
  WHERE receiverID = '5' 
  GROUP BY senderID ) mg
ON m.id = mg.last
您可能希望根据表的大小检查设置了哪些键

使用MAX的问题是,如果在
id
字段中使用MAX,则它将获得您要查找的号码,但是在另一个字段中使用MAX不会获得与该id匹配的数据。使用子查询方法,内部查询正在进行排序,然后外部的组将根据内部查询中的行顺序进行分组。

这里是我的:)

SELECT * FROM messages m
JOIN 
( SELECT senderID, MAX(id) AS last
  FROM messages 
  WHERE receiverID = '5' 
  GROUP BY senderID ) mg
ON m.id = mg.last
这是我的:)


你能把问题的措辞改一下吗?可能是一个您试图实现的示例列表结果。为什么在这里使用
分组依据
?我使用分组依据是因为我想要每个senderID的最后一行。您可以重新表述这个问题吗?可能是您试图实现的一个示例列表结果为什么在这里使用
groupby
?我使用groupby是因为我想要每个senderID的最后一行。这几乎奏效了。。是的,它获取senderID的最后一行,但是senderID只有一行的行,在组出现在分组行之前,我正要评论您仍然可以排序外部查询,但对于您所要查找的内容,并不是100%清楚。很高兴看到它有所帮助。这几乎奏效了。。是的,它获取senderID的最后一行,但是senderID只有一行的行,在组出现在分组行之前,我正要评论您仍然可以排序外部查询,但对于您所要查找的内容,并不是100%清楚。很高兴看到它有所帮助。