Mysql 根据第二列中日期值最大的列选择不同的值
标题有点复杂。很抱歉,对于非SQL人员来说,查询也很复杂 我有一个具有以下结构的表消息: Messageid、发送者id、接收者id、消息日期时间 我的目标是选择接收方id从不同的发送方接收的最后一条消息 例如,当我这样做时:Mysql 根据第二列中日期值最大的列选择不同的值,mysql,sql,Mysql,Sql,标题有点复杂。很抱歉,对于非SQL人员来说,查询也很复杂 我有一个具有以下结构的表消息: Messageid、发送者id、接收者id、消息日期时间 我的目标是选择接收方id从不同的发送方接收的最后一条消息 例如,当我这样做时: SELECT * FROM `message` WHERE `receiver_id` =1 我得到的结果是: 1005 | 2 | 1 | 2015-11-08 1004 | 3 | 1 | 2015-11-
SELECT *
FROM `message`
WHERE `receiver_id` =1
我得到的结果是:
1005 | 2 | 1 | 2015-11-08
1004 | 3 | 1 | 2015-11-07
1003 | 3 | 1 | 2015-11-06
1002 | 2 | 1 | 2015-11-05
1001 | 2 | 1 | 2015-11-04
1005 | 2 | 1 | 2015-11-08
1004 | 3 | 1 | 2015-11-07
而我需要的是:
1005 | 2 | 1 | 2015-11-08
1004 | 3 | 1 | 2015-11-07
1003 | 3 | 1 | 2015-11-06
1002 | 2 | 1 | 2015-11-05
1001 | 2 | 1 | 2015-11-04
1005 | 2 | 1 | 2015-11-08
1004 | 3 | 1 | 2015-11-07
非常感谢您一贯的专家指导。我真的被这样的疑问难住了。再次感谢并为错误的格式表示抱歉
Select * from (
Select * from `Message` where receiver_id=1 order by message_datetime desc
) a group by a.sender_id
此查询首先按日期对数据进行排序,然后按发件人id对数据进行分组。您需要创建一个子查询,该子查询按发件人id返回给定收件人的最大邮件id,并将其连接到邮件表以获取所有其他字段:
SELECT m.*
FROM `message` AS m
INNER JOIN (SELECT sender_id, MAX(message_date) as md
FROM message WHERE `receiver_id` =1 GROUP BY sender_id) AS t
ON m.message_date=t.md and m.sender_id=t.sender_id
WHERE `receiver_id` =1
谢谢您的提问,先生,我会在一段时间内试一试,并提供反馈,尽管我觉得这已经是迈向solutionPerfect的正确方向,等待计时器过期。非常感谢+1此解决方案的唯一问题是,它依赖于某些mysql配置设置来运行,并且代码不可移植。如果你想利用mysql,而不一定要求所有字段都在crlause的组中或使用摘要函数,那么你甚至不需要使用子查询。考虑到还有其他更好的、有文档记录的解决方案,我认为这种无文档记录的黑客最好是将maxid作为id、sender\u id、receiver\u id、,maxmessage\u datetime作为消息组中的消息\u datetime按发送方\u id,其中接收方\u id=1感谢您的时间,先生,我正在仔细阅读您的查询,并将其与已起作用的未定义的\u变量进行比较。我当然会从中学习+1PL详细说明您遇到的错误消息或意外行为。为了分享,我建议您阅读以下内容:因为这里的方法有助于将同一查询从原始SQL转换为对象查询语言,如条令查询生成器。因此,正如我在上一篇评论中提到的,不使用聚合函数且与DQL和条令查询生成器兼容的一种更有效的方法是:在a.sender\u id=b.sender\u id和a.message\u date