通过 id mysql 查找具有最新日期的行

Posted

技术标签:

【中文标题】通过 id mysql 查找具有最新日期的行【英文标题】:Finding rows with latest date by id mysql 【发布时间】:2021-10-07 22:27:34 【问题描述】:

我有这 2 个表,我正在尝试编写一个查询来帮助我选择所有给出此结果的行

用户

id name
1 test
2 test2

日志

id userId message date
1 1 this is a test 2020-10-07 12:57:14
2 1 another reason 2020-10-07 13:57:14
3 1 another reason 2 2020-10-07 14:57:14
4 2 another reason 3 2020-10-04 12:57:14
5 2 another reason 4 2020-10-05 12:57:14
6 2 another reason 4 2020-10-06 12:57:14

输出表 我需要像在这种情况下(1,2)一样传递许多用户ID,并在表格下方仅返回每个用户ID每行的MAX(日期)

id userId message date
3 1 another reason 2 2020-10-07 14:57:14
6 2 another reason 4 2020-10-06 12:57:14

这可以通过一个查询实现吗?这是我有但不工作的东西

SELECT 
id ,
userId ,
message,
date
FROM logs
WHERE userId IN (1,2)
ORDER BY date DESC;

【问题讨论】:

【参考方案1】:

您可以使用窗口函数 ROW_NUMBER 的结果来检索这些结果。

SELECT
    id,userId,message,date
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY userId
            ORDER BY date DESC
        ) as rn
    FROM 
        logs
) t
WHERE rn=1 AND
      userId IN (1,2)
ORDER BY date DESC

对于旧的 mysql 版本

SELECT
    id,userId,message,date
FROM (
    SELECT 
        l.*,
        @row_num:=IF(userId=@prev_user_id,@row_num+1,1) as rn,
        @prev_user_id:=userId
    FROM 
        logs l
    CROSS JOIN (
        SELECT @row_num:=0, @prev_user_id:=NULL
    ) as vars
    ORDER BY userId, date DESC
    
) t
WHERE rn=1 AND
      userId IN (1,2)
ORDER BY date DESC

【讨论】:

不工作我收到错误您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '( PARTITION BY 附近使用的正确语法 你用的是什么版本的mysql? mysql 5.7.34 就是这样一个 我为旧的 mysql 版本添加了一个替代方案。让我知道这是否适合您。

以上是关于通过 id mysql 查找具有最新日期的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL+获取具有最新日期的行+row_number()+重复时的情况

查找具有特定值的最新记录

用于从表中选择具有最新时间戳的行的 JOOQ 代码

MySQL 按 ID 和最新日期时间分组

从每组中的 3 个表中选择 sql 中具有最新日期的行

我只想查看具有最新报告日期的行