MySQL - Felder mit verschiedenen Bedingungen summieren

Hallo,

für meine Schule soll ich ein Programm schreiben, das es ermöglicht, die Fehlstunden der Abiturienten online zu verwalten. Dabei gibt es entschuldigte und unentschuldigte Fehlstunden. Ich möchte aus meiner Tabelle
a) die gesamte Anzahl der Fehlstunden pro Kurs und Schüler und
b) die Anzahl der unentschuldigten Fehlstunden pro Kurs und Schüler auslesen (das Gegenteil wäre natürlich auch möglich).

Diese Angaben werden gebraucht, da die Schüler nach 20 (oder 30?) unentschuldigten Fehlstunden pro Schuljahr die Schule verlassen müssen.

Meine Datenbank sieht folgendermaßen aus:

Ich habe eine Tabelle ‘user’, in der sämtliche Schüler und Lehrer samt Passwort gespeichert sind.
Felder:
[ul][li]id[/li]
[li]username[/li]
[li]password[/li][/ul]

Dann habe ich noch eine Tabelle ‘groups’, in der alle Oberstufenkurse als Gruppen, aber auch Gruppen für a) alle Lehrer und b) alle Schüler des Abiturjahrgangs 2009 (2010, 2011 usw.)
Felder:
[ul][li]id[/li]
[li]name[/li][/ul]

Name ist dabei der Kursname, z.B. 2009_M1 für den ersten LK Mathe des Abi-Jahrgangs 2009.

Desweiteren habe ich eine Tabelle ‘groupbelongings’, in der ich Gruppen und Schüler/Lehrer zusammenfüge.
Felder:
[ul][li]id[/li]
[li]userid[/li]
[li]groupid[/li][/ul]

Als letztes gibt es noch eine Tabelle, in der die Fehlstunden gespeichert werden. Dazu soll jeweils der Kurs und das Datum des Fehlens gespeichert werden.
Felder:
[ul][li]id[/li]
[li]numer[/li]
[li]excused[/li]
[li]userid[/li]
[li]groupid[/li]
[li]date[/li][/ul]

Das Feld “excused” ist dabei boolean, je nachdem, ob entschuldigt oder nicht. “number” enthält die Anzahl der Fehlstunden.

Folgendes SQL-Statement nutze ich, um alle Kurse und die jeweilige gesamte Anzahl der Fehlstunden eines Schülers auszulesen:

SELECT groups.name, groups.id, SUM(fehlstunden.number) as fehlstunden FROM groups LEFT JOIN groupbelongings ON groupbelongings.groupid = groups.id LEFT JOIN fehlstunden ON groupbelongings.groupid = fehlstunden.groupid AND fehlstunden.userid = 1 WHERE groups.name LIKE '2009_%' AND groupbelongings.userid = 1 GROUP BY id

Daraus ergibt sich dann folgendes Ergebnis:

name id fehlstunden 2009_BI2 3 NULL 2009_SP2 4 NULL 2009_d2 5 6 2009_m1 6 1 2009_ek1 7 NULL 2009_zsowi2 8 NULL 2009_zge4 9 NULL 2009_e4 10 NULL 2009_ch1 11 NULL

Für den Schüler sind folgende Fehlstunden eingetragen:

3 Stunden in Kurs 5, nicht entschuldigt
3 Stunden in Kurs 5, entschuldigt
1 Stunde in Kurs 6, nicht entschuldigt

Mein Problem ist jetzt, dass ich entweder nur entschuldigte, nur unentschuldigte Fehlstunden oder alle Fehlstunden auslesen kann.

Ich hoffe, dass ich ich keine Angaben vergessen habe, wenn doch, bitte Nachfragen.

Falls ihr noch weitere Tipps in Bezug auf mein Datenbank-Design habt: Ich würde mich drüber freuen.

Vielen Dank,
Patrick Hilker

Wenn du in einer Abfrage alle entschuldigten und alle unentschuldigten Stunden auslesen möchtest, dann könnte man statt nur ein feld für die anzahl der fehlstunden zwei felder, für alle entschuldigten und alle unentschuldigten für einen tag eintragen. oder so.
Vielleicht wäre es in der aktuellen Struktur auch möglich in der Abfrage einen zweiten join auf die Tabelle fehlstunden zu machen, um damit auch all die anderen zu erhalten… aber inwieweit das möglich oder sinn voll ist… :confused:

Und noch was, wenn ich die Abfrage richtig verstanden hab, versuchst du von einem user sämtliche Fehlstunden aus allen Gruppen zu ermitteln, da allerdings in der Tabelle fehlstunden die userid und groupid enthalten ist, dneke ich ist ein JOIN in groupbelongings in dem Fall überflüssig.
Man müsste doch nur etwa so:

SELECT ... FROM fehlstunden LEFT JOIN groups ON fehlstunden.groupid = groups.id WHERE fehlstunden.userid = 1
würde das nicht den selben effekt haben?
Auf die selbe art könnte man dann noch die usertabelle joinen, wenn man den namen wissen will.
Sinn im join zu groupbelongings seh ich nur dann wenn man damit sichergehen will, dass der user wirklich in der gruppe eingetragen ist, damit ihm nicht fehlstunden zugeschrieben werden, die er nicht begangen hat. Das sollte man imho aber beim Eintragen regeln.

mfg Balmung