Sven Rautenberg: Mysql -> Having

Beitrag lesen

Moin!

Ich habe eine Frage bezüglich MySQL.

Du bist in die wohlbekannte MySQL-Falle getappt, die beim Gruppieren bereitgehalten wird.

"SELECT * FROM Products GROUP BY CustomerId, Product HAVING MAX(IssueDate)"

SELECT * funktioniert zusammen mit GROUP BY nicht. MySQL liefert leider keinen Fehler, weil es diese Abfrage intern "optimiert", diese Optimierung ist allerdings nur in seltenen Fällen gültig.

Faustregel: Wann immer GROUP BY benutzt wird, dürfen in der Liste der selektierten Spalten nur auftauchen:
1. alle in GROUP BY auch aufgelisteten Spalten
2. alle anderen Spalten nur in Verbindung mit Aggregatfunktionen wie z.B. MAX, COUNT, AVG, SUM, etc...

Folgt also für dich: Du kannst mit deiner Abfrage derzeit nur CustomerID und Product ermitteln, weil nix anderes im GROUP BY steht. Logischerweise kannst du auch noch das Maximum der Spalte IssueDate in die Selektion aufnehmen. Aber mehr Infos kriegst du erstmal nicht.

Führe diese Abfrage mal durch in einem Admin-Tool (wie PHPMyAdmin). Dann siehst du die Liste.

Jetzt geht es ans Filtern unerwünschter Einträge. Mit WHERE filterst du, welche Datensätze in die Gruppierung eingehen sollen. Mit HAVING filterst du, welche gruppierten Ergebnisse ins Endergebnis einfließen sollen.

Funktioniert nicht... Habe da als Beispiel mehrere Datensätze kreiirt. Jeder ist ein Jahr höher. Trozdem wird der 2006 anstatt 2007 angezeigt. Aber nie 2005 oder 2004, was somit auch korrekt ist.
Wieso aber 2006 statt 2007, geht das mit dem HAVING anders? Oder ist es gar illegal?

Ohne Beispieldaten dürfte es schwierig werden, dein Problem nachzuvollziehen. Welche Bedeutung haben die Spalten? Was willst du ermitteln?

- Sven Rautenberg

--
"Love your nation - respect the others."