Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL MIN/MAX gibt den richtigen Wert zurück, aber nicht die zugehörigen Datensatzinformationen

Sie sind den lockeren MySQL-Regeln zum Opfer gefallen, die es zulassen, dass Nicht-Aggregate in eine GROUP BY-Abfrage eingeschlossen werden. Sicher, Sie arbeiten mit MIN oder MAX und nur mit ONE zu einem Zeitpunkt, aber betrachten Sie diese Abfrage:

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

Überlegen Sie nun, welche Zeile die Statusspalte sollte kommen. Es ist absurd, eine Korrelation zwischen den Aggregat-Spalten (die in GROUP BY) und Nicht-Aggregat-Spalten herzustellen.

Schreiben Sie Ihre Abfrage stattdessen so

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

Aber wenn Sie zwei Datensätze mit demselben "created_timestamp" haben, wird es noch schwieriger

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