【问题标题】:Select latest message of each conversation选择每个对话的最新消息
【发布时间】:2018-11-15 16:39:39
【问题描述】:

我有两张桌子:

聊天from 是发第一条消息的人)

id | id_from | id_to
1  | 1       | 2
2  | 1       | 3
3  | 3       | 2
4  | 4       | 1

消息

id | content | date                | id_chat | id_from | id_to
1  | hi      | 2017-10-04 23:14:41 | 1       | 1       | 2
2  | hello   | 2017-10-04 23:15:03 | 1       | 2       | 1
3  | heey    | 2017-10-04 23:40:00 | 4       | 4       | 1

我想得到每个对话的最后一条消息。

我试过了(1是用户登录的id):

SELECT MAX(id) AS idMessage, id_from, id_to, content, date 
FROM message 
WHERE 1 IN (id_from, id_to) 
GROUP BY id_chat
ORDER BY idMessage 
DESC LIMIT 10

我收到了最新的对话,但我收到的是每个对话的第一条消息,而不是最后一条。如何获取最后一条消息?

【问题讨论】:

  • 我不明白我认为最新的意思是最后一条消息,可以清楚地解释你想要什么。
  • @AmiteshKumar 没错,就是最后一条消息。例如,通过上面的查询,我得到的消息是 id_chat = 1 的内容为“hi”而不是“hello”(最后一条记录)的消息
  • 您可以通过聊天ID选择最大(日期)组。然后加入桌聊获得额外属性

标签: mysql sql select group-by chat


【解决方案1】:
select m1.*
from messages m1
join
(
  SELECT MAX(id) as id
  FROM message
  GROUP BY id_chat
) m2 on m1.id = m2.id

【讨论】:

  • 它工作!我刚刚在子查询上的GROUP BY 之前添加了WHERE 1 IN (id_from, id_to)(否则代码会从所有用户那里获取最新消息,而不仅仅是登录用户)和ORDER BY id DESC 在子查询的末尾。
  • 要获得最后一条消息,您可以简单得多:SELECT * FROM message WHERE 1 IN (id_from, id_to) ORDER BY id DESC LIMIT 1
【解决方案2】:
SELECT m.content as idMessage, m.id_from, m.id_to, m.date  from message as m JOIN chat c WHERE <Logged_ID> = m.id_chat ORDER BY m.date DESC LIMIT 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多