sql >> Databasteknik >  >> RDS >> Mysql

MySQL MIN/MAX returnerar korrekt värde, men inte relaterad postinformation

Du har fallit offer för MySQL:s slappa regler som tillåter att icke-aggregat inkluderas i en GROUP BY-fråga. Visst, du arbetar med MIN eller MAX och bara ONE åt gången, men överväg den här frågan:

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

Fundera nu på vilken rad statuskolumnen ska komma från. Det är absurt att sätta en korrelation mellan de aggregerade (de i GROUP BY) och icke-aggregerade kolumner.

Skriv istället din fråga så här

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 om du hade två poster med samma create_timestamp blir det ännu svårare

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. Påverkar ordningen på kolumner i en select-sats frågehastigheten?

  2. Hur kan jag bli av med dessa kommentarer i en MySQL-dump?

  3. Infogar Postgres json-kolumn med hjälp av wildfly

  4. Grundläggande om parallellprogrammering med Fork/Join Framework i Java