MySQL - 查找第一个Child的最新版本

MySQL - Find the latest version of the First Child

我有一个 Parent object 有很多版本。

CREATE TABLE version (
    id int,
    item_id int,
    logged_at datetime,
    parent_id int
);

CREATE TABLE parent (
  id int
);

INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (1, 1, "2021-12-01 20:00:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (2, 1, "2021-12-01 20:20:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (3, 1, "2021-12-01 21:40:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (4, 2, "2021-12-01 21:40:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (5, 2, "2021-12-01 20:20:00", 1);

INSERT INTO parent (id)
VALUES (1);

如您所见,每个 Version 属于不同的 Items。唯一区分它们的是它们所属的 .item_id.logged_at 属性。

我的objective是找最低.item_id版本最新.logged_at .

因此,在此示例中,所需的结果应为:

VALUES (3, 1, "2021-12-01 21:40:00", 1);

我知道 row_number() 分区可以获得第一个 child,但我很难理解如何进行二次分面搜索。

任何帮助或指点将不胜感激。谢谢!

你可以这样试试

SELECT *, ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY logged_at DESC) row_num
FROM VERSION
ORDER BY logged_at DESC, row_num, item_id
LIMIT 1

根据 logged_in 时间按 PARTITION BY 语法按 item_id 排序。

然后,对于item_id相同的item,按照logged_in.

来决定排名

据此 table,order by logged_in desc 是了解最近登录用户的主要因素,order by row_num, item_id 次要于 select 最低 item_id 在同时登录的用户中。