Verständnisfrage zu GROUP BY Befehl

NoBrainDB

Aktiver Benutzer
Beiträge
30
Hallo!

Folgende zwei Tabellen:
Kurse
Code:
KID    KName
101    Datenbanken
201    Mathe
301    XML

Kursnoten
Code:
MNr    KID    Note
45300    101    1
45300    201    3
45400    201    2
45500    301    1

Abfrage:

Die Kursnamen mit jeweiliger Teilnehmerzahl

Code:
SELECT Kurse.KName, COUNT(Kursnoten.MNr) AS ‚Teilnehmer’ FROM
Kursnoten INNER JOIN Kurse ON Kursnoten.KID = Kurse.KID
GROUP BY Kurse.KName;

Wieso muss ich hier mit group by arbeiten? Wieso kommt als Ergebnis
Code:
Datenbanken  4
, wenn ich das group by weglasse?
 
Werbung:
Das GROUP BY ist zwingend, damit das ganze logisch ist. In solchen Abfragen MÜSSEN alle Spalten des Resultates entweder aggregiert oder gruppiert werden, also entweder in einer Aggregatsfunktion wie sum(), max(), count(), avg() oder andere stehen ODER im GROUP BY. Alles andere ist sinnfrei und unlogisch.

Die Tatsache, daß MySQL dies nicht erzwingt bzw. keinen Fehler wirft, wenn man sich an diese Regel nicht hält, heißt nicht, daß da kein Fehler ist. Um es kurz zu sagen: MySQL ist a) zu blöd, den Fehler zu erkennen und liefert b) dann ein falsches Ergebniss.

Das wurde hier und in vielen anderen Foren schon oft genug thematisiert. Die nächste große Version von MySQL wird diesen Fehler nicht mehr haben, angeblich.
Wer eine konsistente und korrekt funktionierende DB will nimmt übrigens auch kein MySQL.
 
Alles andere ist sinnfrei und unlogisch.

Wieso? :) Genau das ist ja meine Frage.

Ich sehe es als überhaupt nicht unlogisch an, zu sagen: Gibt mir alle Kursnamen und zähl dazu die Teilnehmer. Mir ist nicht klar, warum ich da gruppieren muss?
 
Gibt mir alle Kursnamen und zähl dazu die Teilnehmer. Mir ist nicht klar, warum ich da gruppieren muss?
Zu sagen: Gib mir alle Kursnamen und dazu die Teilnehmer könne auch soetwas sein:

Code:
SQL> Select * From fps_max_test;
KID          KNAME
------------ --------------------------------------------------------------------------------
101          Datenbanken
201          Mathe
301          XML

SQL> Select * From fps_max_test_zwei;
MNR                  KID                NOTE
-------------------- ------------ ----------
45300                101                   1
45300                201                   3
45400                201                   2
45500                301                   1

SQL> Select t.*, (Select count(*) From fps_max_test_zwei) From fps_max_test t;
KID          KNAME                                                                            (SELECTCOUNT(*)FROMFPS_MAX_TES
------------ -------------------------------------------------------------------------------- ------------------------------
101          Datenbanken                                                                                                   4
201          Mathe                                                                                                         4
301          XML                                                                                                           4

SQL>

Aber das ist sicherlich nicht das, was du haben willst oder?
Du hättest ja gerne die Anzahl an Kursteilnehmern PRO Kurs
 
Werbung:
Zurück
Oben