Hilfe bei Datenbankabfrage
Hallo liebe Community,
hab gerade ein Blackout bzgl. Realisierung einer Abfrage.
Folgende Datenbank:
noten: nid, loginname, fid, note, type
(type = 0/1, halbjahr oder endjahr)
klassen: kid, bezeichnung
faecher: fid, bezeichnung
faecherklassen: fkid, kid, fid
Was ich nun will, eine Abfrage welche mir alle Noten für eine Klasse ausliefert, mit der Struktur:
- Fach1, Fach2, Fach3...
Loginname1 Note Note Note
Loginname2 Note Note Note
Loginname3 Note Note Note
Wird dann in einem C# DataGridview dargestellt.
SELECT faecher.bezeichnung, noten.note, noten.loginname FROM klassen INNER JOIN faecherklassen ON klassen.kid = faecherklassen.kid INNER JOIN faecher ON faecherklassen.fid = faecher.fid INNER JOIN noten ON faecher.fid = noten.fid WHERE klassen.kid = (SELECT klassen.kid FROM klassen WHERE klassen.bezeichnung = 'Temp') AND noten.type = 0
Das war mein 1. Gedanke, aber das haut ja überhaupt nicht wirklich hin.
hab gerade ein Blackout bzgl. Realisierung einer Abfrage.
Folgende Datenbank:
noten: nid, loginname, fid, note, type
(type = 0/1, halbjahr oder endjahr)
klassen: kid, bezeichnung
faecher: fid, bezeichnung
faecherklassen: fkid, kid, fid
Was ich nun will, eine Abfrage welche mir alle Noten für eine Klasse ausliefert, mit der Struktur:
- Fach1, Fach2, Fach3...
Loginname1 Note Note Note
Loginname2 Note Note Note
Loginname3 Note Note Note
Wird dann in einem C# DataGridview dargestellt.
SELECT faecher.bezeichnung, noten.note, noten.loginname FROM klassen INNER JOIN faecherklassen ON klassen.kid = faecherklassen.kid INNER JOIN faecher ON faecherklassen.fid = faecher.fid INNER JOIN noten ON faecher.fid = noten.fid WHERE klassen.kid = (SELECT klassen.kid FROM klassen WHERE klassen.bezeichnung = 'Temp') AND noten.type = 0
Das war mein 1. Gedanke, aber das haut ja überhaupt nicht wirklich hin.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 281641
Url: https://administrator.de/forum/hilfe-bei-datenbankabfrage-281641.html
Ausgedruckt am: 23.12.2024 um 10:12 Uhr
11 Kommentare
Neuester Kommentar
Welche Datenbank wäre gut zu wissen.
Du hast mehrere Möglichkeiten:
a) Mehrere, statische Joins, einen für jedes Fach (leicht in der Umsetzung, viel Code, bei neuen Fächern muss angepasst werden)
b) Pivot, abhängig von der Datenbank
c) Rekurisve Abfragen, abhängig von der Datenbank
d) Verkettung der Inhalte (glaube nicht das das in deinem Sinne ist) GROUP_CONCAT (MySQL), XML PATH (MS SQL)
...
Du hast mehrere Möglichkeiten:
a) Mehrere, statische Joins, einen für jedes Fach (leicht in der Umsetzung, viel Code, bei neuen Fächern muss angepasst werden)
b) Pivot, abhängig von der Datenbank
c) Rekurisve Abfragen, abhängig von der Datenbank
d) Verkettung der Inhalte (glaube nicht das das in deinem Sinne ist) GROUP_CONCAT (MySQL), XML PATH (MS SQL)
...
Hier ein Beispiel:
Es empfiehlt sich natürlich die Fächer IDs statisch einzutragen. Die Lösung erfordert für jedes Fach einen Join.
SELECT n0.loginname,
n1.note AS Note_Fach1,
n2.note AS Note_Fach2,
n3.note AS Note_Fach3
FROM ( SELECT DISTINCT loginname
FROM note ) n0
LEFT JOIN noten n1
ON n0.loginname = n1.loginname
AND n1.fid = ( SELECT fid
FROM faecher
WHERE bezeichnung = 'Fach1' )
LEFT JOIN noten n2
ON n0.loginname = n2.loginname
AND n2.fid = ( SELECT fid
FROM faecher
WHERE bezeichnung = 'Fach2' )
LEFT JOIN noten n3
ON n0.loginname = n3.loginname
AND n3.fid = ( SELECT fid
FROM faecher
WHERE bezeichnung = 'Fach3' )
Ich bin in MySQL nicht so fit und es gibt einige Einschränkungen gegenüber z.B. MSSQL mit dem ich viel mache. Aber du müsstest auf jedenfall in der Lage sein mit einer Schleife das Statement zusammenzubauen, also für jedes Fach einen Join zu erzeugen, und dann mit EXEC() auszuführen. Ich weiß aber auch nicht wie Performant das wird wenn man sagen 50 oder 100 Joins führt.
Also bei SELECT DISTINCT loginname FROM note könntest du mit einem WHERE eingrenzen, welche Schüler angezeigt werden sollen. Das ginge auch mit einem Join, diese Abfrage muss einfach nur die richtigen Schüler zurück geben und zu allem was an Schülern raus kommt werden alle Noten gejoint. Wenn du nur bestimmte Noten willst, musst du überhaupt erst weniger Joins machen, das muss in diesem Fall deine Schleife besorgen. Ich würde sagen bei
14. query += "AND n" + i + ".fid = ( SELECT fid ";
15. query += "FROM faecher ";
könnte man noch ein WHERE faecher IN oder NOT IN einbauen.
14. query += "AND n" + i + ".fid = ( SELECT fid ";
15. query += "FROM faecher ";
könnte man noch ein WHERE faecher IN oder NOT IN einbauen.