2013-05-03 68 views
5

今天我遇到了一個有趣的問題(或者我認爲),我認爲分享它會很有成效。加入這兩個特定的表

我有下面的結構兩個數據庫表:

表1:mod_class

class_id 
CSD2311 
CSD2314 
CSD12 

表2:m_classes_enrolled_in

student_id class_id 
5   CSD2311 
5   CSD2314 

因此,第一個表有所有可能的class_id,第二個class_i D和參加該課程的學生。我想創建一個所有班級的列表,學生是沒有註冊。到目前爲止,左聯接看起來很不錯,但它似乎是不可能以這種方式來顯示它:

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 

任何幫助將不勝感激, -D

回答

2

你可以這樣做多種方式

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

完全的答案。謝謝你做的工作! – 2013-05-03 19:10:08

1

這是你在找什麼。

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

我試過同之前沒有工作。無論如何,謝謝你的回答。 – 2013-05-03 18:40:10

+0

立即嘗試..!我編輯了這篇文章。對不起,第一次沒有讀完整個問題。 :P – Manu 2013-05-03 18:44:43

1

難道你不想LEFT JOINmod_class所以你可以做一個反連接?

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

試試這個:

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

使用此: -

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

看到這個SQL FIDDLE