#mysql #row-number #mysql-5.7
#mysql #номер строки #mysql-5.7
Вопрос:
У меня есть родительский объект, у которого много версий.
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
атрибут.
Моя цель-найти самую низкую .item_id
версию с последней .logged_at
версией.
Таким образом, желаемый результат в этом примере должен быть :
VALUES (3, 1, "2021-12-01 21:40:00", 1);
Я понимаю, что разделы row_number() могут получить первый дочерний элемент, но мне трудно понять, как выполнить вторичный фасетный поиск.
Любая помощь или указания будут высоко оценены. Спасибо!
Ответ №1:
вы можете попробовать это так.
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
Сортировка item_id
по logged_in
времени по PARTITION BY
синтаксису.
Затем для предметов с тем же item_id
самым ранжированием определяется в соответствии с logged_in
.
Из этой таблицы order by logged_in desc
является основным, чтобы узнать последнего пользователя, вошедшего в систему, и order by row_num, item_id
второстепенным, чтобы выбрать наименьшего item_id
из пользователей, вошедших в систему в то же время.
Комментарии:
1. Это потрясающе, Сильверстар. Огромное спасибо. Желаю вам отличных выходных.