Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL MIN/MAX renvoie la valeur appropriée, mais pas les informations d'enregistrement associées

Vous avez été la proie des règles laxistes de MySQL qui permettent d'inclure des non-agrégats dans une requête GROUP BY. Bien sûr, vous travaillez avec MIN ou MAX, et seulement ONE à la fois, mais réfléchissez à cette requête :

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

Maintenant, pensez à quelle ligne la colonne d'état doit provenir. Il est absurde de mettre une corrélation entre les colonnes agrégées (celles du GROUP BY) et non agrégées.

Au lieu de cela, écrivez votre requête comme ceci

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

Mais si vous avez deux enregistrements avec le même created_timestamp, cela devient encore plus délicat

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