# [MySQL] Anzahl bei GROUP BY ermitteln. COUNT geht nicht...



## Daxi (6. September 2003)

Hallo!

Ich habe Benutzergruppen und würde diese gerne für alle Mitglieder sichtbar auf meiner Page auflisten. Es soll jeweils die Anzahl der Nutzer dahinter stehe, die in dieser Gruppe sind.

Mein Query:

```
$sql = "SELECT g.Titel, g.GruppenID, COUNT(u.UserID) FROM gruppen g, user u
WHERE u.Gruppen LIKE '%;'+g.GruppenID+';%' GROUP BY g.GruppenID
ORDER BY g.Sorter ASC, g.Titel ASC";
```

Die Syntax würde stimmen. Nur bringt mir der Count-Befehl immer die Anzahl aller User. Nicht die der User, die in der Gruppe sind.
Hat jemand von euch eine Idee wie ich das Problem lösen könnte?

Ich habe früher die Gruppe ausgelesen und danach extra noch die Anzahl der User. Macht bei 9 Gruppen 10 Abfragen. Ich möchte die Abfragenzahl aber möglichst gering halten.


----------



## Mark (6. September 2003)

Hi!

Ich bin mir nicht sicher, aber wenn Du nach g.GruppenID groupst, solltest Du dann nicht auch den COUNT(g.userID) zählen?


----------



## Daxi (6. September 2003)

Das ganze funktioniert ja auch soweit.
Zählen tut er auch. Er gibt mir nur immer die Gesamt-Userzahl aus anstatt der Useranzahl in der Gruppe.

Beispiel:
Gruppe 1: 7 User
Gruppe 2: 10 User
Insgesamt: 17 User.

SQL-Ergebnis:
Gruppe 1 - 17 User
Gruppe 2 - 17 User

Und das ist falsch.
Ich will es so wie oben bekommen und dazu geht Count leider nicht.


----------



## Mark (6. September 2003)

Hi!

Ja, aber zählt doch COUNT(u.UserID) - also Tabelle U - und nicht den COUNT in der Tabelle G... -> COUNT(g.userID)


----------



## Daxi (6. September 2003)

Leider funktioniert das so nicht.
Ich habe leider keine Ahnung warum und was es sonst gibt.
Es wäre nett, wenn du mir das mal so glaubst. Ansonsten fände ich es sehr nett, wenn du mir einen Tipp/Fehler zur Syntax sagen könntest.
MySQL gibt keinen Fehler zurück und ich bekomme auch ein Ergebnis aber wie gesagt (in meinem 2. Post) zeigt er mir immer die Gesamt-Userzahl an.

Habe das gerade noch mit phpMyAdmin auf meinem Server getestet und da gehts auch nicht. Leider.


----------



## Mark (6. September 2003)

Hi!

Ich bin immernoch verwirrt wg. Deiner Vermischung der Tabellen gruppen g und user u.
Wenn die Tabelle user aus den Spalten userID, gruppenID, name... etc. besteht, liefert Dir ein:
SELECT gruppenID, COUNT(userID) FROM user GROUP BY gruppenID
die gruppen mit dazugehöriger user-Anzahl.

Du willst aber ja die Informationen der Gruppe, somit würde ich Left joinen:
SELECT g.gruppenID, g.gruppenName, COUNT(userID) FROM gruppen AS g LEFT JOIN user AS u ON (g.gruppenID=u.gruppenID) GROUP BY g.gruppenID

Hilft das irgendwie?

//edit: sorry: g.gruppenName wäre in Deinem Fall "g.Titel" und es muß lauten ON (g.gruppenID=u.gruppen)


----------



## Daxi (6. September 2003)

Ich hab jetzt schön langsam alles mögliche durch.
Inner Join; Left Join; FROM A, B
und balb bekomm ich die Kriese...
*Anscheinend funktioniert Min, Max und Count nicht mit Group By?!*

Ich habe mit Group By sehr sehr wenige Erfahrungen.
Daher bin ich ratlos.

Hier noch die Beiden Tabellen, die ich verwende:

gruppen:
- GruppenID
- Titel

user:
- UserID
- Gruppen (Varchar, enthält die GruppenIDs getrennt von ;. Am Anfang und am Ende ist auch ein ;. Daher ist die Abfrage LIKE "%;ID;%" möglich.)

Ich will also für diese beiden Tabellen möglichst eine Query haben, die mir den Titel und die ID der Gruppe ausgibt. Zusätzlich soll das Query die Anzahl der zutreffenden User mit ausgeben.

Ich verzweifle echt bald noch und greife wieder zu mehreren Querys.

@Pinky_M: Leider waren deine Querys keine große Hilfe. Mit Left Join bekomm ich auch immer die Gesamt-Userzahl ausgegeben.


----------



## Mark (6. September 2003)

Hi!

Gut, jetzt verstehe ich Dein "Like". Ich dachte jeder User wäre genau einer Gruppe zugeordnet und nicht "ein user in mehreren Gruppen".
Bzgl. MAX(),MIN(),COUNT() funktionieren NUR mit Group by...

Ich weiß nicht, ob die Lösung über die "Gruppenliste" (;aa;bb;xx; ) so konfortabel ist. Meinst Du nicht, es wäre einfacher eine dritte Tabelle dafür zu nehmen:
*user*
userID, name, etc.
*gruppe*
gruppenID, titel, etc.
*zuordnung*
zuordID, userID, gruppenID

So würde ein "Group by" auf "zuordnung" angewendet ganz einfach funktionieren...


----------



## Daxi (6. September 2003)

Danke.
Auch wenn du mir bei dem Query nicht helfen konntest, bin ich trotzdem froh, dass du mir den Hinweis gegeben hast.
Ich mach das jetzt mit einer zusätzlichen Zuweisungstabelle.


----------

