标题有点复杂。我很抱歉,但对于非SQL人员来说查询也很复杂。
我有一个表messages
,它具有以下结构:
消息(id,sender_id,receiver_id,message_datetime)
我的目标是从不同的发件人中选择receiver_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
非常感谢您的常规专家指导。我真的很困惑这样的查询。再次感谢并抱歉格式错误。
答案 0 :(得分:2)
您需要创建一个子查询,该子查询返回给定接收者的sender_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
答案 1 :(得分:0)
Select * from (
Select * from `Message` where receiver_id=1 order by message_datetime desc
) a group by a.sender_id
此查询首先按日期对数据进行排序,然后按发件人ID分组。