GROUP BY - steh ich so auf der Leitung?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

GROUP BY - steh ich so auf der Leitung?

Beitrag von PhilippK »

Ich steh hier gerade von einem Problem bei DB Maintenance: eine Funktion gibt mir einen Wert zurück, obwohl sie eigentlich keinen zurückgeben sollte. Hier die Funktion:

Code: Alles auswählen

SELECT u.user_id, Sum( g.group_single_user ) AS group_count
FROM phpbb_users u
  LEFT JOIN phpbb_user_group ug ON u.user_id = ug.user_id
  LEFT JOIN phpbb_groups g ON ug.group_id = g.group_id
GROUP BY u.user_id
HAVING Sum( g.group_single_user ) <> 1 OR IsNull( group_count )
Habe da nun etwas rumgespielt und festgestellt, dass diese Funktion hier:

Code: Alles auswählen

SELECT u.user_id, Sum( g.group_single_user ) AS group_count
FROM phpbb_users u
  LEFT JOIN phpbb_user_group ug ON u.user_id = ug.user_id
  LEFT JOIN phpbb_groups g ON ug.group_id = g.group_id
GROUP BY u.user_id
HAVING group_count <> 1 OR IsNull( group_count )
hingegen einwandfrei funktioniert. Der einzige Unterschied ist der erste Teil des HAVING-Teils.

Ich stehe derzeit gerade gewaltig auf dem Schlauch, wieso dieser Fehler auftritt. Hat da jemand eine Idee?

Hier noch das Ergebnis der ersten Query:

Code: Alles auswählen

user_id | group_count
---------------------
-1      | 1
Es exisitiert in der phpbb_users ein Datensatz mit der ID -1 (der Gast-Account), für den dann genau ein Datensatz in der phpbb_user_group und einer in der phpbb_groups (mit group_single_user = 1) existiert.

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
hope
Mitglied
Beiträge: 16
Registriert: 27.02.2003 14:15

Beitrag von hope »

Also laut SQL-Standard kann man die Aliase nicht in where und having-Klauseln nehmen, daher ist das wohl ein normales verhalten, wobei ich gehört habe das manche mysql4 das können. Und die Doku von mysql das eigentlich bestätigt. Also etwas strange das ganze
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

hope hat geschrieben:Also laut SQL-Standard kann man die Aliase nicht in where und having-Klauseln nehmen, daher ist das wohl ein normales verhalten, wobei ich gehört habe das manche mysql4 das können. Und die Doku von mysql das eigentlich bestätigt. Also etwas strange das ganze
Tja, das hatte ich auch gedacht:
MySQL Manual hat geschrieben:Columns selected for output can be referred to in ORDER BY and GROUP BY clauses using column names, column aliases, or column positions
Nun, irgendwie will das mir sowohl auf dem Produktiv-System (3.23.58) als auch auf dem Test-System (4.0.20-nt) nicht :-?

Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Antworten

Zurück zu „Coding & Technik“