[英]MySQL Query to retrieve last entry in another table
我在一个简单的聊天应用程序中有 2 个 mysql 表(版本次要到 MySql 8)
聊天
id_chat | 聊天名称 |
---|---|
1 | 我的第一次聊天 |
2 | 我的第二次聊天 |
和Chat_Message
id_chat_message | id_chat | 信息 | 日期 |
---|---|---|---|
1 | 1 | 如何 | 2021 年 3 月 3 日 |
2 | 1 | 你是 | 2021 年 3 月 4 日 |
3 | 2 | 这个 | 2021 年 3 月 5 日 |
4 | 2 | 是其他 | 2021 年 3 月 6 日 |
如果我想检索每次聊天的最后一条消息,如何进行查询?
结果集应该是
id_chat | 聊天名称 | 最后一个消息 | last_message_date |
---|---|---|---|
1 | 我的第一次聊天 | 你是 | 2021 年 3 月 4 日 |
2 | 我的第二次聊天 | 是其他 | 2021 年 3 月 6 日 |
谢谢
在 MySQL 8+ 上,我们可以在这里使用ROW_NUMBER
:
WITH cte AS (
SELECT c.id_chat, c.chat_name, cm.message, cm.date,
ROW_NUMBER() OVER (PARTITION BY c.id_chat ORDER BY cm.date DESC) rn
FROM Chat c
INNER JOIN Chat_Message cm ON cm.id_chat = c.id_chat
)
SELECT id_chat, chat_name, message, date AS last_message_date
FROM cte
WHERE rn = 1;
在 MySQL 的早期版本中,我们可以加入子查询,从第二个表中找到最新的聊天消息。
SELECT c.id_chat, c.chat_name, cm.message, cm.date AS last_message_date
FROM Chat c
INNER JOIN Chat_Message cm
ON cm.id_chat = c.id_chat
INNER JOIN
(
SELECT id_chat, MAX(date) AS max_date
FROM Chat_Message
GROUP BY id_chat
) t
ON t.id_chat = cm.id_chat AND t.max_date = cm.date;
经过一些测试,我得到了这个,但我不是 100% 确定它在所有情况下都有效:
SELECT hc.id_chat, hc.chat_name, hcm.message as last_message, hcm.date as last_message_date from chat hc inner join (SELECT a.*
FROM chat_message a
INNER JOIN (
SELECT id_chat, MAX(date) date
FROM chat_message
GROUP BY id_chat
) b ON a.id_chat = b.id_chat AND a.date = b.date) hcm on hc.id_chat = hcm.id_chat group by hcm.id_chat;
一些灵感来自SQL select 仅在列上具有最大值的行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.