繁体   English   中英

MySQL 查询以检索另一个表中的最后一个条目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM