mysql - 从更优化的 2 个表中获取 MySQL 的最新记录
问题描述
我在 SQL 中的查询有一些问题。我有 2 张桌子。
people
+----+--------+------+
| id | name | val2 |
+----+--------+------+
| 1 | john | 12 |
| 2 | adam | 5 |
| 3 | alfred | 3 |
+----+--------+------+
data
+----+----+----+-----+---------------------+
| id | v1 | v2 | v3 | date |
+----+----+----+-----+---------------------+
| 1 | 4 | 15 | 18 | 2020-10-16 11:15:53 |
| 1 | 2 | 12 | 17 | 2020-10-16 11:22:53 |
| 1 | 3 | 13 | 16 | 2020-10-16 11:32:53 |
| 2 | 1 | 16 | 15 | 2020-10-16 13:22:53 |
| 2 | 3 | 13 | 25 | 2020-10-16 13:42:53 |
| 2 | 4 | 12 | 35 | 2020-10-16 14:12:53 |
| 3 | 1 | 21 | 12 | 2020-10-16 14:12:53 |
| 3 | 2 | 28 | 42 | 2020-10-16 15:12:53 |
| 3 | 4 | 30 | 72 | 2020-10-16 16:12:53 |
+----+----+----+-----+---------------------+
我需要在一个表 ID、NAME、v1、v2、v3、date 中获取第一个表中所有对象的新日期,如下所示:
RESULT
+----+--------+----+----+-----+---------------------+
| id | name | v1 | v2 | v3 | date |
+----+--------+----+----+-----+---------------------+
| 1 | john | 3 | 13 | 16 | 2020-10-16 11:32:53 |
| 2 | adam | 4 | 12 | 35 | 2020-10-16 14:12:53 |
| 3 | alfred | 4 | 30 | 72 | 2020-10-16 16:12:53 |
+----+--------+----+----+-----+---------------------+
我需要第一张桌子上所有人的第二张桌子上的最新记录。我尝试通过这个查询来做到这一点:
SELECT people.id,
people.name,
data.v1,
data.v2,
data.v3,
max(data.date)
FROM people
JOIN DATA ON people.id = data.id
GROUP BY people.id
我得到了最新的数据,但 v1、v2、v3 是表中随机的。
解决方案
一种简单的方法使用窗口函数:
SELECT p.id, p.name, d.v1, d.v2, d.v3, d.date)
FROM people p JOIN
(SELECT d.*,
ROW_NUMBER() OVER (PARTITION BY d.id ORDER BY d.date DESC) as seqnum
FROM data d
) d
ON p.id = d.id AND d.seqnum = 1;
注意: 中的连接列似乎很data
奇怪id
。我希望它被称为类似people_id
.
推荐阅读
- asp.net-core - 在 asp.net core 3.1+ 中使用多个中间件进行身份验证和授权
- java - Java String.contains() 无法正常工作
- amazon-cloudformation - AWS MediaLive Cloudformation Fn::GetAtt 获取数组值
- c - 我怎样才能为“月/日”写一个正确的函数而不是我写的?
- javascript - 如何用java脚本隐藏div?
- java - tomcat、Java Servlet、Apache Netbeans 中的 404 错误
- kotlin - RxJava在处理后一直在发射项目,如何正确处理?
- elasticsearch - Elastic APM - 在 C# 代理库中使用 traceparent/trace_id 创建事务/跨度
- python-3.x - Discord py 为每个循环创建一个新的 tasks.loop 对象
- reactjs - 如何在蚂蚁设计中制作芯片组件的模拟/或如何管理图标以达到类似的结果?