sql >> Base de Datos >  >> RDS >> Mysql

MySQL MIN/MAX devuelve el valor adecuado, pero no la información de registro relacionada

Ha sido víctima de las reglas laxas de MySQL que permiten incluir elementos no agregados en una consulta GROUP BY. Claro, estás trabajando con MIN o MAX, y solo UNO a la vez, pero considera esta consulta:

SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest,
    MAX(created_timestamp) as latest
  FROM conditions
  GROUP BY condition_id

Ahora, piensa en qué fila debe provenir la columna de estado. Es absurdo poner una correlación entre las columnas agregadas (las del GROUP BY) y las no agregadas.

En su lugar, escriba su consulta de esta manera

SELECT X.condition_id, C.status, X.earliest
FROM (
  SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest
  FROM conditions
  GROUP BY condition_id
) X JOIN conditions C
  on CONCAT(c.work_type, c.work_id) = X.condition_id
  and c.created_timestamp = X.earliest

Pero si tenía dos registros con la misma marca de tiempo created_timestamp, se vuelve aún más complicado

SELECT X.condition_id, Max(C.status) status, X.earliest
FROM (
  SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest
  FROM conditions
  GROUP BY condition_id
) X JOIN conditions C
  on CONCAT(c.work_type, c.work_id) = X.condition_id
  and c.created_timestamp = X.earliest
GROUP BY X.condition_id, X.earliest