[SQL] Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

27o8

abgemeldet
2 Mai 2006
9.028
933
[SQL] Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Habe folgenden Query, aber er funktioniert nicht:

Code:
SELECT COUNT(akt.id) AS anzahl, cat.* FROM 
                                    bonus_kategorien AS cat
                                    LEFT JOIN aktionen AS akt ON akt.kategorie = cat.id
                            WHERE cat.bild != "" ORDER BY cat.first DESC, cat.name ASC
Fehlermeldung ist:
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

Sagt ja eigenltich aus, dass ich dort kein COUNT() verwenden darf, weil ich kein GROUP nutze :think: aber wieso? Ich will doch nur die Anzahl der aktionen, zur aktuellen Kategorie :wall:
 
Ja, und eben deshalb musst du die Aktionen nach Kategorie gruppieren:
Code:
SELECT COUNT(akt.id) AS anzahl, cat.* FROM bonus_kategorien AS cat LEFT JOIN aktionen AS akt ON akt.kategorie = cat.id WHERE cat.bild != "" GROUP BY akt.kategorie ORDER BY cat.first DESC, cat.name ASC
 
Würde mich wundern, wenn das funktioniert. Grundsätzlich musst Du nach allen Spalten gruppieren, die in der SELECT-Liste drin stehen und keine Gruppierungsfunktion ( z.B. SUM,MIN ... ) verwenden.
Solange cat.* in der SELECT-Liste steht, müsste der GROUP BY demnach über alle diese Spalten gehen.

Sowas sollte eher funktionieren:

PHP:
SELECT cat.* ,  COALESCE(akt.anzahl,0) as anzahl
FROM bonus_kategorien AS cat 
LEFT JOIN 
( SELECT kategorie , count(*) as anzahl
FROM aktionen 
GROUP BY kategorie ) AS akt
ON akt.kategorie = cat.id
WHERE cat.bild != ""
ORDER BY cat.first DESC, cat.name ASC


Wobei man natürlich grundsätzlich nur die Spalten lesen sollte, die man auch benötigt, so dass ein * in der SELECT-Liste überdenkt werden sollte
 
Zuletzt bearbeitet:
In MySQL im Non-Strict-Mode muss man das nicht.
MySQL is clever und wenns offensichtlich is, dass eine Spalte nur genau eine Ergebniszeile liefern kann, dann meckert es auch nicht. (Mit Strict-Mode kenn ich mich nicht aus)

Die Fehlermeldung, um die es im Topic geht, ist eigentlich logisch, wenn man mal drüber nachdenkt.


Vereinfachtes Beispiel:
Ich habe Menschen, die ein Geschlecht (ENUM(male, female)) und ein Alter (TINYINT) haben.
S*x|age
male|34
male|23
female|34
female|11
male|16
female|19
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] S*x, [B][COLOR=#9932cc]AVG[/COLOR][/B][COLOR=#9932cc]([/COLOR]age[COLOR=#9932cc])
[/COLOR][B][COLOR=#9932cc]FROM[/COLOR][/B] people;[/FONT]
Was ich haben will, is klar. Aber der Datenbank nicht.
Die hat für die Spalte S*x jetzt 6 Treffer und für AVG(age) nur 1 Treffer.
S*x|AVG(age)
male|22,83333...
male|:think:
female|:think:
female|:think:
male|:think:
female|:think:
is natürlich Quark.

Eine Aggregatsfunktion fasst immer alle Zeilen zu einem Ergebnis zusammen. Will man daneben noch etwas stehen haben, muss gruppiert werden und zwar nach allem anderen, was selektiert wird. Damit wird pro Restspalten jeweils separiert aggregiert und die Ergebnisse können dann neben die Restspalten geschrieben werden.
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] S*x, [B][COLOR=#9932cc]AVG[/COLOR][/B][COLOR=#9932cc]([/COLOR]age[COLOR=#9932cc])[/COLOR][/FONT]
[FONT=Courier New][B][COLOR=#9932cc]FROM[/COLOR][/B] people
[/FONT][FONT=Courier New][B][COLOR=#9932cc]GROUP BY [/COLOR][/B]S*x[/FONT][FONT=Courier New];[/FONT]
S*x|AVG(age)
male|24,33333...
female|21,33333...
 
MySQL is clever und wenns offensichtlich is, dass eine Spalte nur genau eine Ergebniszeile liefern kann, dann meckert es auch nicht. (Mit Strict-Mode kenn ich mich nicht aus)

Strict Mode

Einer der Gründe, warum der Strict Mode in den meisten Fällen keinen Sinn macht. Es spart eine Menge Tipparbeit, nicht alles auflisten zu müssen 8)

Greetz

paddya
 
Einer der Gründe, warum der Strict Mode in den meisten Fällen keinen Sinn macht. Es spart eine Menge Tipparbeit, nicht alles auflisten zu müssen 8)

sehe ich nicht so.

Ohne den Strict Mode baust du SQL-Querys die unlogisch sind und die MySQL nur durch raten korrigieren kann.

Zudem ist man damit wieder eine Eigenheit von MySQL los, die viel zu lapidare Entwicklung zulässt, also ich operiere nur im STRICT_ALL_TABLES-Mode.
 
Zuletzt bearbeitet:
Einer der Gründe, warum der Strict Mode in den meisten Fällen keinen Sinn macht. Es spart eine Menge Tipparbeit, nicht alles auflisten zu müssen
"Tipparbeit sparen" ist meiner Ansicht nach eine schwache Ausrede für unsauberes Ausformulieren der Queries...
Eine Abfrage, die hunderte oder tausende Male durchlaufen wird, darf durchaus verlangen, ein Mal korrekt formuliert zu werden...

#Edit: zu langsam... :ugly:
 
Zuletzt bearbeitet: