首页 > 解决方案 > 从更优化的 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 是表中随机的。

标签: mysqlsqldatetimemaxgreatest-n-per-group

解决方案


一种简单的方法使用窗口函数:

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.


推荐阅读