sql >> Database teknologi >  >> RDS >> Mysql

MySQL MIN/MAX returnerer korrekt værdi, men ikke de relaterede postoplysninger

Du er blevet ofre for de slappe MySQL-regler, der gør det muligt at inkludere ikke-aggregater i en GROUP BY-forespørgsel. Selvfølgelig arbejder du med MIN eller MAX og kun ONE ad gangen, men overvej denne forespørgsel:

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
 

Tænk nu over hvilken række statuskolonnen skal komme fra. Det er absurd at sætte en sammenhæng mellem de aggregerede (dem i GROUP BY) og ikke-aggregerede kolonner.

Skriv i stedet din forespørgsel sådan her

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

Men hvis du havde to poster med det samme create_timestamp, bliver det endnu mere tricky

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. Hvordan fortolker man output fra MySQL EXPLAIN?

  2. Oracle - returner flere tæller som én forespørgsel

  3. Sådan testes Select for Update i MySQL

  4. cakephp tilføjer rekord med nogle faste parametre