2013-02-07 139 views
0

加入我有3个表,命名为过滤与条件

students (id, name) 
subjects (id, name, is_published) 
student_subjects (id, student_id, subject_id) 

进去student_subjects采取一个学生的科目。但也有地方student_subjects包含NULL subject_id一个学生

以下情况下对Students

1;"John" 
2;"Ahmeah" 
3;"Dina" 
4;"Leo" 
5;"Lenon" 

主题表

1;"Computer Sci";1 
2;"Physics";1 
3;"Bio";1 
4;"Maths";0 

Student_subjects

1;1;1 
2;1;2 
3;1;4 
4;2;1 
5;2;3 
6;2;4 
7;3;2 
8;4;1 
9;5;NULL 

目前获取的所有数据学生与他们的主题学分也显示谁没有连接到他受到了学生的名字,我使用的查询,如下所示

SELECT 
    students.*, 
    inners.name 
FROM 
    students 
    LEFT JOIN (SELECT 
       student_id, 
       subjects.name 
       FROM 
       student_subjects 
       JOIN subjects ON (student_subjects.subject_id = subjects.id AND subjects.is_published = 1) 
      ) AS inners ON (inners.student_id = students.id) 

有没有更好的方式做同样的http://sqlfiddle.com/#!12/9cf93/12

回答

1
SELECT s.*, su.name AS SubjName 
FROM students AS s 
LEFT JOIN student_subjects AS ss ON ss.student_id = s.id 
LEFT JOIN subjects AS su ON su.id = ss.subject_id 

请问与您列出的相同。那是你的追求?

+0

对不起,我似乎已经错过了(subjects.is_published = 1) – Akash

+0

的查询条件。您可以通过如下方式添加一行:'LEFT JOIN subject as su su su.id = ss.subject_id AND su.is_published = 1' – mrunion

+0

这不起作用,因为这也会显示所有没有附加在student_subjects中的学生 – Akash