2013-06-13 105 views
1

我不知道这一点,到目前为止,我有这些表:MySQL的 - 选择没有匹配或有一个条件的行

  • 学生 - 列:ID,名称
  • stud_class - 列:students_id,类标识码
  • - 列:ID,courses_id
  • 课程 - 列:ID,名称

,我需要选择那些没有匹配的行中的stud_class表学生OR那些谁在类的指定当然不是(在给定的过程是一个参数)。

例如:选择没有任何班级或班级中的学生,但不包括course.id = 2的班级。

我到目前为止这样做,但它不起作用,查询返回没有行。我知道这有点令人困惑,但我不知道如何在这种情况下使用JOINS。

SELECT students.id, students.name 
FROM students, stud_class, class 
WHERE (NOT (students.id = stud_class.students_id)) 
    OR ((students.id=stud_class.students.id) AND 
     (stud_class.class_id=class.id) AND 
     (NOT (class.course_id=2)) 
    ); 
+0

与您的问题无关,但您的查询使用较旧的ANSI-89样式连接。可能要考虑切换到[ANSI-92样式JOINs](http://en.wikipedia.org/wiki/Join_%28SQL%29)。 – Leigh

回答

2

如果我正确地解释你的问题,你要寻找的是在没有班上某个课程所有学生 - 不管他们是否有其他类与否。在这种情况下,这是否工作?

SELECT id, name FROM students 
WHERE id NOT IN (
    SELECT stud_class.students_id FROM stud_class, class 
    WHERE stud_class.class_id = class.id 
    AND class.courses_id = 2 
) 

提交查询谁是在类课程2的所有学生的ID(根据你的榜样),以及主查询得到谁在名单并非所有学生的ID。

+0

谢谢!这正是我想要的,它的工作完美无瑕。 –

相关问题