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
在同时登录的用户中。
我有一个 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
在同时登录的用户中。