Mysql 如何通过x DESC查询分组
下面的SELECT语句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 *
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%清楚。很高兴看到它有所帮助。