Select von 4 Tabellen ... ?

licht400

Mitglied
Hi,
ich möchte 4 Tabellen miteinander verbindern. Dabei sieht die Struktur so aus (mySQL)

Tabelle Schüler:

IDS| Vorname| Nachname|Klasse

Tabelle Fach:

IDF| Fach

Tabelle Klausurnoten:

IDK| IDS| IDF| Note|

Tabelle Leistungskontrolle:

IDL| IDS| IDF| Note|


Das sind meine 4 Tabellen.

Ausgabe soll folgendermaßen sein.

IDS| Vorname|Nachname|Klasse|Fach |Klausurnote|Leistungskontrollnote|
1 Gunnar | Heinz | 10a |Mathe| 1,2,3 | 2,3,3
2 Gabriel | Erla | 10a |Mathe| 5,6,6,6 | 6,2


Das Problem ist, das ich die Anzeige soweit hinbekomme, aber das die Noten nicht immer übereinstimmen. Oft sind diese doppelt vorhanden, auch wenn sie nur einmal in der DB stehen..z.B steht nur 2,3 in der DB..nach der Abfrage dann 2,3,3.

mein Abfrage schaut so aus:

Code:
 SELECT Schüler.IDS, Schüler.Nachname, Schüler.Vorname,Fach.Fach,
GROUP_CONCAT( Klausurnoten.Note SEPARATOR ', ' ) AS KLs,
GROUP_CONCAT( Leistungskontrolle.Note SEPARATOR ', ' ) AS LKs
FROM `Schüler`
Left JOIN `Klausurnoten`ON Schüler.IDS = Klausurnoten.IDK
Left JOIN `Leistungskontrolle` ON Schüler.IDS = Leistungskontrolle.IDL
Left JOIN `Fach` ON Fach.IDF = Leistungskontrolle.IDF and Fach.IDF = Klausurnoten.IDF
where Fach='Mathe'
Group by Schüler.Nachname


hab ich ein generellen Aufbaufehler oder woran liegts....?Wäre schön wenn einer helfen könnte:)
 
Zuletzt bearbeitet:
Wenn du das ganze mit den Abhängigkeiten aufzeichnen würdest kähmst du auf ein Viereck.

Code:
     S
   /   \
  K    L
   \   /
     F


Es gibt ev. einen schöneren Weg, aber auf die Schenlle würd ich es etwa so probieren, dass ich einen Baum mache anstelle des Vierecks im SQL habe
Code:
     S
   /   \
  K    L
  |    |
  F    F

SQL:
SELECT S.IDS, S.Nachname, S.Vorname, KF.Fach,
GROUP_CONCAT( KF.Note SEPARATOR ', ' ) AS KLs,
GROUP_CONCAT( LF.Note SEPARATOR ', ' ) AS LKs
FROM `Schüler` AS S
	LEFT JOIN (SELECT 
					K.*, 
					F.Fach
				FROM 
					Klausurnoten AS K,
					Fach AS F
				WHERE 
					K.IDF = F.IDG
					AND F.Fach = 'Mathe') AS KF
		ON S.IDS = KF.IDS
	LEFT JOIN (SELECT 
					L.*, 
					F.Fach
				FROM 
					Leistungskontrolle AS L,
					Fach AS F
				WHERE 
					L.IDF = F.IDG
					AND F.Fach = 'Mathe') AS LF
		ON S.IDS = LF.IDS
Group by S.Nachname
 
Zuletzt bearbeitet von einem Moderator:
Danke, verständlich. Habe ich mal übernommen..und dem Schüler 1

die Klassenarbeitsnote 1,2,3 hinzugefügt
und Leistungkontrollnoten 4


Aber mit der Abfrage kommt dann raus:

KL : 1,2,3

LK: 4,4,4 ....?

Der füllt die 4 mit der selben Anzahl an Klassenarbeitsnoten auf..wieso ?
 
hm.. ist eigentlich klar. Wir müssen das ganze GROUP_BY abändern. Jedes Subquery muss selber gruppiert werden.

Versuch mal das folgende
SQL:
SELECT DISTINCT S.IDS, S.Nachname, S.Vorname, KF.Fach,
FROM `Schüler` AS S
	LEFT JOIN (SELECT 
					K.*,
					GROUP_CONCAT( K.Note SEPARATOR ', ' ) AS KLs, 
					F.Fach
				FROM 
					Klausurnoten AS K,
					Fach AS F
				WHERE 
					K.IDF = F.IDG
					AND F.Fach = 'Mathe'
				GROUP BY L.IDS) AS KF
		ON S.IDS = KF.IDS
	LEFT JOIN (SELECT 
					L.*,
					GROUP_CONCAT( L.Note SEPARATOR ', ' ) AS LKs 
					F.Fach
				FROM 
					Leistungskontrolle AS L,
					Fach AS F
				WHERE 
					L.IDF = F.IDG
					AND F.Fach = 'Mathe'
				GROUP BY L.IDS) AS LF
		ON S.IDS = LF.IDS
 
Zuletzt bearbeitet von einem Moderator:
Übnernommen..

allerdings gibts mir jetz nur noch id|Nachname|Vorname|Fach| aus..da fehlen aber KLs und LKs, obwohl sie doch da sein müssten..^^
 
Oh stimmt, hab vergessen sie in das übergreifende SELECT zu nehmen. Musst sie nur noch da hinzufügen.

Wenn es funktioniert solltest du dich hinsetzen und verscuhen zu verstehen was das Query macht.
 
An sich verstehe ich es ...

Code:
SELECT DISTINCT S.IDS, S.Nachname, S.Vorname, KF.Fach,
KF.Note AS LKs,
LF.Note AS LKs
FROM `Schüler` AS S
    LEFT JOIN (SELECT
                    K.*,
                    GROUP_CONCAT( K.Note SEPARATOR ', ' ) AS KLs,
                    F.Fach
                FROM
                    Klausurnoten AS K,
                    Fach AS F
                WHERE
                    K.IDF = F.IDG
                    AND F.Fach = 'Mathe'
                GROUP BY L.IDS) AS KF
        ON S.IDS = KF.IDS
    LEFT JOIN (SELECT
                    L.*,
                    GROUP_CONCAT( L.Note SEPARATOR ', ' ) AS LKs
                    F.Fach
                FROM
                    Leistungskontrolle AS L,
                    Fach AS F
                WHERE
                    L.IDF = F.IDG
                    AND F.Fach = 'Mathe'
                GROUP BY L.IDS) AS LF
        ON S.IDS = LF.IDS
GROUP BY S.Nachname

so schauts aus.

Aber:

Ergebniss lautet jetz .....|1|4|

obwohl es lauten müsste ....|1,2,3|4
 
KLs unf LKs sind in den Subqueries bereits berechnet. Warum nimmst du dann die Note?

SQL:
SELECT DISTINCT S.IDS, S.Nachname, S.Vorname, KF.Fach, LKs, LKs
FROM ...
 
Was kleines.

Wenn ich 1 Leistungskontroll-Note eintrage, derjenige aber noch keine Klausurnote hat, wird in das Fach "null" geschrieben...

Das gleiche geschieht aber nicht umgedreht..wenn ich eine Klausurnote eintrage, und keine LK Note eintrage, erscheint das Fach. ^^

PS: das liegt daran, das ich oben KF.Fach stehen habe ^^..müsste das ja für beide stehen haben :)!
 
Zuletzt bearbeitet:
Zurück