Select von 4 Tabellen ... ?

OK, habs mal getestet. Machen wir aus WHERE halt HAVING. Ist nicht mehr ganz performant aber dort funktioniert es auch wenn keine Datensätze vorhanden sind:

SQL:
SELECT DISTINCT
    S.IDPerson,
    S.Nachname,
    S.Vorname,
    IFNULL(KF.KLs, '') AS KLs,
    IFNULL(LF.LKs, '') AS LKs,
    F.Fach
FROM   
    (SELECT @fach:= IDFach, Fach FROM Fach WHERE Fach = 'Mathe' )   AS F,
    `übersicht` AS S
        LEFT JOIN ( SELECT
        				K.IDPerson,
                        GROUP_CONCAT(K.Note SEPARATOR ', ') AS KLs
                  FROM
                        klassenarbeit AS K
                  GROUP BY K.IDPerson, K.IDFach
                  HAVING K.IDFach = @fach   
                  ) AS KF
         ON S.IDPerson = KF.IDPerson
        LEFT JOIN (SELECT
                         L.IDPerson,
                         GROUP_CONCAT(L.Note SEPARATOR ', ') AS LKs
                   FROM
                         leistungskontrolle AS L
                   GROUP BY L.IDPerson
                   HAVING L.IDFach = @fach
                   ) AS LF
        ON S.IDPerson = LF.IDPerson     
GROUP BY s.Nachname
 
Zuletzt bearbeitet von einem Moderator:
Danke.

Welcher unterschied liegt den zwischen WHERE und HAVING?



Vll. zum Insert was kleines:) Wenn ich die untenstehende Insert in mySql anwende, kommt zurück:
"# MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen)."
und das bei Last_Insert_ID();

Aber die benötige ich doch, um die ID vom Schüler auf die beiden Notentabellen zu übertragen..oder?

Code:
INSERT INTO `notenverwaltung`.`schüler` (`IDPerson`, `Vorname`, `Nachname`, `Klasse`)
VALUES (NULL, 'Heiko', 'Herrlich', '11a');

SET @USERID := Last_Insert_ID();

INSERT INTO `notenverwaltung`.`klassenarbeit` (`IDK` ,`IDPerson` ,`Note` ,`IDFach`)
VALUES (NULL , @USERID, '6', '2');


INSERT INTO `notenverwaltung`.`leistungskontrolle` (`IDL` ,`IDPerson` ,`Note` ,`IDFach`)
VALUES (NULL , @USERID, '6', '2');
 
WHERE wird for dem GROUP BY gefiltert. HAVING danach.

Zum anderen Problem. Habs mal kurz getestet. Die Meldung wird zwar als Info angezeigt, er arbeitet das Script aber richtig ab.

Ansonsten kannst du anstelle des SET auch mit SELECT arbeiten
SQL:
INSERT INTO test (id, userid, y)
VALUES (NULL, 15, 2010);

SELECT @ID := Last_Insert_ID();

INSERT INTO test (id, userid, y)
VALUES (NULL, @ID, 2011);
 
Zuletzt bearbeitet von einem Moderator:
Ok, danke schön.

Jap, habs gesehen das es funktioniert.

Aber in Java haut er mir eine Exception raus, das die Syntax nicht korrekt wäre. Das liegt dann aber eher an der Queryeinstellung in Java :)

Also klappt erstmal soweit. Danke dir für die schnellen antworten :)
 
Mhh ein Problem was ich gerade sehe.

Selbige Abfrage.

Wenn ich dem Schüler eine Note in Mathe geht das soweit.
Sobald ich dem Schüler in einem weiteren Fach eine Note gebe, wird die leistungskontrolle Note aus Mathe mit in das andere Fach genommen.

Siehe ein einzelnes Fach.

Code:
SID | Name| ....| Fach  | LKs| KLs|
1     | Meier | .... | Mathe|1     | 2|

so, hab ich ein 2. Fach. Englisch, füge da eine Note (KL =4, LK =2) hinzu, nimmt er die Noten aus Mathe und haut sie in Englisch und in Mathe ist es dann leer!

SID | Name| ....| Fach  | LKs| KLs|
1     | Meier | .... |Engl   |1,2     | 2,4|

Verstehe ich nicht!
 
Zurück