2010-01-03 85 views
1

我有三個表,這些字段:如何獲取通過該錶鏈接的所有記錄集?

:class_id |名稱|等級

classes_students:class_id | student_id

學生:student_id |名稱

班級與學生有1:n的關係,所以一個班級可以有很多學生。我想選擇一個班級的所有學生,其中class_id是5.

我可以做這樣的事嗎?

SELECT student.name FROM students student 
LEFT JOIN classes_students link 
    ON link.class_id = 5 
    AND link.student_id = student.student_id 

我不確定我是否需要這裏的連接,如果這必須是「左連接」?我想要的只是一個包含學生姓名的記錄集。

+1

您所做的以下陳述並不完全正確:「班級與學生有** 1:n **關係,所以一個班級可以有很多學生」。實際上,班級和學生之間的關係是** n:n **,因爲一個班級可以有很多學生**和**一個學生可以有很多班級。因此需要你的'classes_students'表。如果它確實是一個** 1:n **關係,則不需要'classes_students'表。 – Asaph 2010-01-03 18:35:27

回答

1

用途:

SELECT s.name 
    FROM STUDENTS s 
    JOIN CLASSES_STUDENTS cs ON cs.student_id = s.student_id 
          AND cs.class_id = 5 

或者:

SELECT s.name 
    FROM STUDENTS s 
    JOIN CLASSES_STUDENTS cs ON cs.student_id = s.student_id 
    JOIN CLASSES c ON c.class_id = cs.class_id 
WHERE c.class_id = 5 

因爲你想讓學生只能在一個特定的階層,你會使用一個INNER JOIN。如果您想要說出所有學生的列表,然後左加入CLASSES_STUDENTS以知道是否正在上課(因爲那些不在CLASSES_STUDENTS列中的空值將爲空值),您可以使用LEFT JOIN。我建議looking at this link for the breakdown of various JOINs and their impact on the data you'll get back

0
SELECT 
    student.name 
FROM 
    students student 
INNER JOIN 
    classes_students link 
ON 
    link.student_id = student.student_id 
WHERE 
    link.class_id = 5 

您的查詢實際上應該正常工作,如果你只需要改變你的加入到內蒙古,但我更喜歡使用WHERE子句來篩選結果,而不是把它放置在連接標準,我覺得它更清晰。

相關問題