Rouven: Mysql -> Having

Beitrag lesen

Hello,

Ich hab es so probiert:
"SELECT * FROM Products GROUP BY CustomerId, Product HAVING MAX(IssueDate)"

keine Sorge, dein hiesiger Fehler unterläuft wohl allen, die GROUP BY auf MySQL lernen...
Eine SELECT Klausel in einer gruppierten Abfrage darf nur zwei Typen von Spalten enthalten:

  1. gelistet unter GROUP BY
  2. mittels Aggregatfunktion (MAX, SUM, ...) aus der Gruppe auf einen Wert aggregiert
    --> logischer Erklärung: es ist nicht klar, welcher Wert für eine andere Spalte dort hingehört - selbst wenn du als Mensch argumentierst, "ich gruppiere Nutzer nach Sozialversicherungsnummer, da ist doch der Name immer gleich", das ist für die Datenbank nicht ersichtlich. Leider unterlässt MySQL diese Prüfung und liefert dir keinen Fehler. Das sollte dich nicht davon abhalten, sauber nach den SQL-Regeln zu arbeiten.

Wieso aber 2006 statt 2007, geht das mit dem HAVING anders? Oder ist es gar illegal?

IMHO jein, also syntaktisch erlaubt aber sinnfrei. HAVING MAX(IssueDate) heißt nur in menschliche Sprache übersetzt "und hat das maximale IssueDate" - für die Datenbank entbehrt der Vergleich einer Grundlage, die will wissen welches MAX-Date du suchst. Entweder du lässt HAVING weg, selektierst MAX(IssueDate) mit, sortierst danach und verwendest LIMIT, oder du wendest ein weiteres SUBSELECT an
SELECT ..., MAX(IssueDate) m_i_dt
HAVING m_i_dt = (SELECT ... )

MfG
Rouven

--
-------------------
There's no such thing as a free lunch  --  Milton Friedman