通过 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 查找具有最新日期的行的主要内容,如果未能解决你的问题,请参考以下文章