(napis (fk) oznacza klucz obcy)
student[id, imie, nazwisko,...]
zajecia[id,nazwa,rok_akademicki,semestr...]
student_zajecia[zajecia_id(fk), student_id(fk)] (obsługuje relację w-w pomiedzy student i zajecia)
ocenienie[id,id_zajec(fk) data,punkty_max,...] - nazwa może nietrafiona, ale ma obsługiwać kartkówki, kolokwia, referaty, zadania domowe - wszystko to, z czego można dostać ocenę.
oceny[id, id_studenta(fk), ocenienie_id(fk), ocena,...] - dla danego studenta i danego "ocenienia" (np. kolokwium) przypisuje ocene (i inne dane).
Na parę (id_studenta, ocenienie_id) nałożony jest klucz UNIQUE (jedna osoba z jednego kolokwium może dostać conajwyżej jedną ocenę).
Mam taki problem: dla danej liczby (np. 2) chciałbym znaleźć listę studentów wraz z ich ocenami z danego kolokwium (tzn. kolokwium o id=2), ale aby ta lista obejmowała tylko tych studentów, którzy uczęszczają na zajęcia, z którego było to kolokwium.
To chyba jasne. Np. kolokwium o id=2 jest z przedmiotu XYZ. Chcę listę studentów chodzących na zajęcia XYZ, a obok nich ich oceny z tego kolokwium (Jeśli nie pisali koła, to powinno zwrócić NULL).
Moje dwa sposoby zrobienia tego są dość skomplikowane:
1)
SELECT s.id, s.imie, s.nazwisko, o.ocena FROM student s LEFT JOIN oceny o ON s.id = o.id_studenta AND o.ocenienie_id =2 WHERE s.id IN ( SELECT s.id FROM student s, student_zajecia s_z, ocenienie oc WHERE s_z.student_id = s.id AND s_z.zajecia_id = oc.id_zajec AND oc.id =2 )
2)
SELECT s.id, s.imie, s.nazwisko, o.ocena FROM (student s, student_zajecia s_z, ocenienie oc) LEFT JOIN `oceny` o ON s.id = o.id_studenta AND o.ocenienie_id =2 WHERE s_z.student_id = s.id AND s_z.zajecia_id = oc.id_zajec AND oc.id =2
Moje pytania:
1) Jak to da się zrobić prościej (jeśli można

2) Który ze sposobów jest bardziej wydajny (na mojej małej bazie danych nie potrafię tego sprawdzić - różnice są w ułamkach sekund)?
Dodam, ze to są moje jak dotąd najbardziej skomplikowane zapytania; stąd moje obawy co do nich.