Hopsel: (MySQL) Gruppierung von Datensätzen, Probleme mit NULL

Beitrag lesen

Hi Vinzenz!

Ich hege die Befürchtung, dass Du überhaupt nicht verstanden hast, was eine Gruppierung machen soll. Du hast auch nicht verstanden, was die HAVING-Klausel bewirkt.

Ohje! Ohja! Du hast Recht mit deiner Befürchtung.

id (autoincrement, primary)   |   wert (integer, NULL erlaubt)
——————————————————————————————————————————————————————————————
1                                 9
2                                 83
3                                 NULL
4                                 92
5                                 NULL
6                                 NULL
7                                 92
8                                 92

Welches Ergebnis möchtest Du bei Deinen Beispieldaten haben?

Hab´ ich doch glatt vergessen, das gewünschte Ergebnis zu posten:
id | wert
----------
1  |  9
2  | 83
3  | NULL
4  | 92
5  | NULL
6  | NULL

Möchtest Du ein anderes Ergebnis, so gib es an und begründe, warum Du genau diese Daten haben möchtest.

Ich brauche diese NULL-Werte, weil ich keinen Einfluss darauf habe, ob der Wert belegt ist oder nicht.
Ist er aber belegt und es gibt weitere Datensätze mit dem gleichen Wert, so brauche ich den Datensatz mit der niedrigsten ID.
Alle Datensätze ohne einen Wert - also wert IS NULL - müssen zusätzlich in die Ergebnismenge

Möchtest Du hingegen *alle* ids mit NULL-werten, so wäre eine UNION angebracht. Auf jeden Fall ist es eine gute Idee, die erste Abfrage Deiner UNION entsprechend meinem Vorschlag umzuschreiben.

Ja, das habe ich auch getan.

Benötigst Du noch weitere Informationen aus dem Datensatz mit diesem kleinsten Wert, so benötigst Du eine korrelierte Unterabfrage.

Glücklicherweise hast du diesen Fall gleich mit einbezogen.

Demzufolge hätte ich dann diese Abfrage:

(SELECT id,wert /* weitere Spalten */  
FROM test t1                -- id und wert aus Tabelle test,  
WHERE wert IS NOT NULL      -- wobei wert nicht NULL  
AND id = (  
  SELECT MIN(id)            -- und nur den Datensatz  
  FROM test t2              -- mit der niedrigsten id  
  WHERE t1.wert = t2.wert  
  )  
)  
  
UNION                       -- vereinige mit  
  
(SELECT id,wert             -- id und wert aus Tabelle test,  
FROM test                   -- wobei wert NULL  
WHERE wert IS NULL)  
  
ORDER BY id ASC             -- sortiere die vereinigte Ergebnismenge

Ich hoffe, die Kommentare passen diesmal zum Code. ;-)

Von allen DBMS, die ich kenne, ist nur MySQL so schlampig, solche fehlerhaften Statements auszuführen. Da in vielen Fällen zufällig(!) das gewünschte Ergebnis rauskommt, glaubt der SQL-Novize (der nur MySQL kennt), sein Statement sei in Ordnung - und wundert sich, wenn mal was anderes rauskommt.

Heißt das, ich darf GROUP BY ausschließlich in Verbindung mit Aggregatfunktionen nutzen?

MfG H☼psel

--
"It's amazing I won. I was running against peace, prosperity, and incumbency."
George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)