SQL为用户邮寄过的每个联系人选择最后一条消息

时间:2014-01-02 19:01:37

标签: php mysql sql

我有一个提醒电子邮件系统的消息系统 - 消息存储为重复 - 一个用于发送者,一个用于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)

EDIT2

感谢@AgRizzo回答问题:)

3 个答案:

答案 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