Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据第二列中日期值最大的列选择不同的值_Mysql_Sql - Fatal编程技术网

Mysql 根据第二列中日期值最大的列选择不同的值

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-

标题有点复杂。很抱歉,对于非SQL人员来说,查询也很复杂

我有一个具有以下结构的表消息:

Messageid、发送者id、接收者id、消息日期时间

我的目标是选择接收方id从不同的发送方接收的最后一条消息

例如,当我这样做时:

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