我有一个提醒电子邮件系统的消息系统 - 消息存储为重复 - 一个用于发送者,一个用于reciver。 “messages”表结构是:
message_id | date_and_time | text | user_id | contact_id | sender_id
我在这里只有user_id
,我需要为所有联系人选择最后一条消息,并按date_and_time DESC
对整个结果进行排序,这样我得到的结果与此类似{{1} }}):
user_id=40
我正在寻找其他答案,并试图为我做查询,但我没有成功。
我的猜测是message_id | date_and_time | text | user_id | contact_id | sender_id
1 | 2014-01-02 20:00:00 | Test 1 | 40 | 32 | 40
4 | 2014-01-02 12:00:00 | Test 2 | 40 | 99 | 99
6 | 2014-01-02 09:00:00 | Test 3 | 40 | 28 | 40
和MAX()
+ GROUP BY
但
ORDER BY
抛出错误......
我的查询中的错误在哪里或我的查询应该如何?
感谢。 编辑:我正在使用MySQL(5.6.14)
感谢@AgRizzo回答问题:)
答案 0 :(得分:2)
要获取所有联系人的最后一条消息,请使用:
SELECT messages.*
FROM messages
JOIN (SELECT contact_id, MAX(date_and_time) as time_when
FROM messages
GROUP BY contact_id) AS mostrecent
ON mostrecent.contact_id = messages.contact_id
AND mostrecent.time_when = messages.date_and_time
ORDER BY date_and_time DESC
答案 1 :(得分:1)
你可以尝试LEFT JOIN吗?
SELECT a.*
FROM messages a LEFT JOIN messages b ON a.user_id = b.user_id AND a.date_and_time < b.date_and_time
WHERE b.user_id IS NULL
答案 2 :(得分:0)
*
,然后指定剩余的列/自定义别名,请尝试以下
SELECT *,contact_id, MAX(date_and_time) as time_when
FROM messages WHERE user_id = 40
GROUP BY contact_id, date_and_time
ORDER BY date_and_time DESC