Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL MIN/MAX retornando o valor adequado, mas não as informações de registro relacionadas


Você foi vítima das regras lax do MySQL que permitem que não-agregados sejam incluídos em uma consulta GROUP BY. Claro, você está trabalhando com MIN ou MAX e apenas ONE de cada vez, mas considere 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

Agora, pense em qual linha a coluna de status deve vir. É absurdo colocar uma correlação entre as colunas agregadas (as do GROUP BY) e não agregadas.

Em vez disso, escreva sua consulta assim
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

Mas se você tivesse dois registros com o mesmo created_timestamp, fica ainda mais 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