【问题标题】:Finding rows with latest date by id mysql通过 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;

【问题讨论】:

    标签: mysql sql


    【解决方案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 版本添加了一个替代方案。让我知道这是否适合您。
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2018-03-21
    • 2015-08-26
    • 2016-02-23
    • 2022-01-16
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多