sql >> Database >  >> RDS >> Mysql

MySQL MIN/MAX geeft de juiste waarde terug, maar niet de gerelateerde recordinfo

U bent ten prooi gevallen aan de lakse MySQL-regels die het mogelijk maken dat niet-aggregaten worden opgenomen in een GROUP BY-query. Natuurlijk, je werkt met MIN of MAX, en slechts EEN tegelijk, maar overweeg deze vraag:

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

Denk nu na over welke rij de statuskolom moet vandaan komen. Het is absurd om een ​​correlatie te leggen tussen de aggregatiekolommen (die in de GROUP BY) en niet-geaggregeerde kolommen.

Schrijf in plaats daarvan uw vraag als volgt

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

Maar als je twee records had met dezelfde created_timestamp, wordt het nog lastiger

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


  1. Formulier php . opschonen en valideren

  2. MySQL - Converteer MM/DD/YY naar Unix-tijdstempel

  3. MySQL voorwaardelijke SELECT in SELECT

  4. XML-tekenreeks ontleden die is opgeslagen op Oracle Table