2013-05-03 14 views
5

Spotkałem dzisiaj interesujący problem (przynajmniej tak mi się wydaje) i pomyślałem, że byłoby produktywne udostępnienie go.Dołączenie do tych dwóch tabel szczegółowych

mam dwóch tabel bazy danych za pomocą konstrukcji:

Tabela 1 mod_class

class_id 
CSD2311 
CSD2314 
CSD12 

Tabela 2: m_classes_enrolled_in

student_id class_id 
5   CSD2311 
5   CSD2314 

Tak więc pierwszy stół ma wszystkie możliwe id_klasy, a drugie - class_i d's i uczeń, który jest zapisany w tej klasie. Chciałbym utworzyć listę wszystkich klas, których uczeń jest niezarejestrowany w. Tak daleko po lewej przyłączyć wyglądał naprawdę ładne, ale wydaje się niemożliwe, aby wyświetlić go w ten sposób:

SELECT mod_enrolled_in.class_id 
FROM mod_enrolled_in 
WHERE student_id <> 5 
INNER JOIN mod_class 
ON mod_enrolled_in.class_id = mod_class.class_id 

Każda pomoc będzie bardzo mile widziane, -D

Odpowiedz

2

Można to zrobić na kilka sposobów

1)

Select class_id from mod_class 
EXCEPT 
    Select class_id From m_classes_enrolled_in WHERE student_id = 5 

2)

Select class_id from mod_class 
Where class_id NOT IN 
     (Select class_id From m_classes_enrolled_in WHERE student_id = 5) 

3)

Select class_id from mod_class m 
LEFT JOIN 
    (Select class_id From m_classes_enrolled_in WHERE student_id = 5) cs 
    ON m.class_id = cs.class_id 
WHERE cs.class_id IS NULL 
+0

Dość pełna odpowiedź. Dziękuję, że to się stało! –

1

To jest to, czego szukasz.

SELECT mod_enrolled_in.class_id 
FROM mod_enrolled_in 
LEFT JOIN mod_class 
ON mod_enrolled_in.class_id = mod_class.class_id 
WHERE class_id != 5 
AND mod_class.class_id is NULL 
+0

Próbowałem to samo, zanim nie działa. Dziękuję za odpowiedź. –

+0

Spróbuj teraz ..! Edytowałem post. Niestety nie przeczytałem całego pytania przy pierwszej okazji. : P – Manu

1

Nie chcesz, aby LEFT JOINmod_class, więc można zrobić anti-join?

SELECT mod_class.class_id 
FROM mod_class 
LEFT JOIN mod_enrolled_in ON (mod_class.class_id = mod_enrolled_in.class_id 
AND mod_enrolled_in.student_id = 5) 
WHERE mod_enrolled_in.class_id IS NULL 
1

Spróbuj tego:

SELECT c.class_id 
FROM mod_class c 

LEFT OUTER JOIN mod_enrolled_in e 
ON e.class_id = c.class_id 
AND e.student_id = ? 

WHERE e.student_id IS NULL; 
1

Użyj tego: -

Select class_id from mod_class 
Where class_id NOT IN (Select class_id From m_classes_enrolled_in) 

Zobacz ten SQL FIDDLE

Powiązane problemy