2013-05-03 10 views
5

Ich habe heute ein interessantes Problem (oder so scheint es mir) und ich dachte, es wäre produktiv, es zu teilen.Beitreten zu diesen beiden spezifischen Tabellen

Ich habe zwei Datenbanktabellen mit dem folgenden Konstrukt:

Tabelle 1: mod_class

class_id 
CSD2311 
CSD2314 
CSD12 

Tabelle 2: m_classes_enrolled_in

student_id class_id 
5   CSD2311 
5   CSD2314 

So ist die erste Tabelle hat alle möglichen class_id's und der zweite hat class_i d's und der Student, der in dieser Klasse eingeschrieben ist. Ich möchte eine Liste aller Klassen erstellen, die der Student nicht in eingeschrieben ist. Bisher ein links kommen sah wirklich schön, aber es scheint unmöglich, es auf diese Weise angezeigt werden:

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 

Jede Hilfe wäre sehr dankbar, -D

Antwort

2

Sie können tun, dass mehrere Möglichkeiten

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

Ziemlich vollständige Antwort. Danke, dass es den Job gemacht hat! –

1

Dies ist, was Sie suchen.

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

habe ich versucht, das gleiche, bevor es nicht funktioniert hat. Danke für die Antwort sowieso. –

+0

Jetzt versuchen ..! Ich habe den Beitrag bearbeitet. Sorry hat die ganze Frage beim ersten Mal nicht gelesen. : P – Manu

1

Wollen Sie nicht LEFT JOINmod_class so können Sie eine Anti-Join tun?

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

Try this:

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

verwenden: -

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

Sehen Sie diese SQL FIDDLE

Verwandte Themen