MySQL – Encuentra la última versión del Primer Hijo.
Tengo un objeto Padre que tiene muchas Versiones.
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);
Como puedes ver, cada “Versión” pertenece a diferentes “Items”. Donde lo único que los diferencia es el atributo “.item_id” al que pertenecen y el atributo “.logged_at”.
Mi objetivo es encontrar la versión con el “.item_id” más bajo y con el “.logged_at” más reciente.
Por lo tanto, el resultado deseado en este ejemplo sería:
VALUES (3, 1, "2021-12-01 21:40:00", 1);
Entiendo que las filas de número de fila () pueden adquirir el primer hijo, pero tengo dificultades para entender cómo hacer una búsqueda faceted secundaria.
Cualquier ayuda o consejo sería muy apreciado. ¡Gracias!
davy.ai
Para lograr el resultado deseado de encontrar la versión más baja de
item_id
con el últimologged_at
, se puede usar la funciónROW_NUMBER()
en MySQL 5.7.Aquí hay una consulta de ejemplo:
Desglosemos la consulta:
version
y aplica la funciónROW_NUMBER()
sobre una partición definida por la columnaitem_id
. La cláusulaORDER BY
ordena primero porlogged_at
en orden descendente (el más reciente primero) y luego porid
en orden ascendente (elid
más pequeño primero, lo que asegura que obtenemos la versiónitem_id
más baja en caso de empates por el últimologged_at
).La consulta externa selecciona solo las filas donde la columna
ROW_NUMBER()
(rn
) es igual a 1, filtrando efectivamente todas las versiones excepto la más reciente para cadaitem_id
. Finalmente, las filas se ordenan poritem_id
en orden ascendente.El resultado de esta consulta sobre los datos de muestra sería: