2011-05-12 18 views
0

我想在rails上做下面的紅寶石,但即使我能在mysql中得到一個很好的答案。如果其中一個關聯表的列無法滿足條件,我該如何忽略表中的一行?

我有表學生和課程。學生 - >課程是一對多的關係。

 
    Student     Course 
|--------------| |--------------------------------------| 
|id| name  | |id | course_name | grade | student_id | 
|---------- | |--------------------------------------| 
|S1| student 1 | |C1 | Course1  | A  | S1   | 
|S2| student 2 | |C2 | Course2  | C  | S1   | 
|---------- | |C3 | Course1  | A  | S2   | 
        |C4 | Course2  | B  | S2   | 
        |--------------------------------------| 
select * from Student 
where id NOT IN (select student_id from Course where grade = 'C') 

我想用單一SQL來實現同樣的結果JOIN語句或使用ActiveRecord。

回答

1
SELECT * FROM Student s 
LEFT JOIN Course c ON s.id=c.student_id AND c.grade = 'C' 
WHERE c.student_id IS NULL; 

或者加入到你的子查詢

SELECT * FROM Student s 
LEFT JOIN (SELECT student_id FROM Course WHERE grade = 'C') c 
WHERE c.student_id IS NULL; 

或者使用存在

SELECT * FROM Student s 
WHERE NOT EXISTS (SELECT NULL FROM Course WHERE grade = 'C' AND student_id=s.id); 

我怕我不能在此刻測試這一點,我有一個懷疑,這些查詢可能不會幫助你。我沒有使用ActiveRecord的經驗。讓我知道在評論中。

+0

第一個SQL語句的工作。我無法理解爲什麼你在哪裏使用'IS NULL'。你能詳細說明一下嗎? – chetu 2011-05-13 14:00:48

+0

@chetu:即使在右側表格(課程)中沒有相應的行,LEFT JOIN可確保左側表格(學生)中的所有行都顯示在結果中。右側列 - 在沒有任何「真實」數據的情況下 - 爲NULL。在這個查詢中,他們是我們想要的學生...在課程表中按等級='C'過濾時沒有顯示的學生。 – 2011-05-13 23:01:43

+0

謝謝你,考伊! – chetu 2011-05-16 15:30:42

0

預言:

select distinct s.* from student s left join course c on c.student_id=s.id where c.grade!='c' 


Student.all(:select=>"distinct student.*",:joins=>"left join course on course.student_id=student.id",:conditions=>"course.grade!='c'") 
+0

它沒有工作。 – chetu 2011-05-13 13:58:34

相關問題