es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado de encontrar la versión más baja de item_id con el último logged_at, se puede usar la función ROW_NUMBER() en MySQL 5.7.

    Aquí hay una consulta de ejemplo:

    SELECT id, item_id, logged_at, parent_id
    FROM (
      SELECT *,
        ROW_NUMBER() OVER (
          PARTITION BY item_id 
          ORDER BY logged_at DESC, id ASC
        ) as rn
      FROM version
    ) v
    WHERE rn = 1
    ORDER BY item_id ASC;
    

    Desglosemos la consulta:

    • La subconsulta interna selecciona todas las columnas de la tabla version y aplica la función ROW_NUMBER() sobre una partición definida por la columna item_id. La cláusula ORDER BY ordena primero por logged_at en orden descendente (el más reciente primero) y luego por id en orden ascendente (el id más pequeño primero, lo que asegura que obtenemos la versión item_id más baja en caso de empates por el último logged_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 cada item_id. Finalmente, las filas se ordenan por item_id en orden ascendente.

    El resultado de esta consulta sobre los datos de muestra sería:

    +----+--------+---------------------+-----------+
    | id | item_id |      logged_at      | parent_id |
    +----+--------+---------------------+-----------+
    |  3 |      1 | 2021-12-01 21:40:00 |         1 |
    |  5 |      2 | 2021-12-01 20:20:00 |         1 |
    +----+--------+---------------------+-----------+
    

Comments are closed.