如何获取某个表未由另一个表链接到某个值的数据库表条目?

时间:2019-06-12 16:26:35

标签: mysql sql

我有一个包含以下表格的数据库:学生,班级,link_student_class。 “学生”包含有关注册学生的信息,“课程”包含有关课程的信息。由于每个学生可以参加多个班级,每个班级可以由多个学生参加,因此我添加了一个链接表,用于在学生和班级之间进行映射。

链接表

id | student_id | class_id
1    1            1
2    1            2
3    2            1
4    3            3

在此表中,student_id和class_id都将出现多次! 我正在寻找的是一个SQL查询,该查询返回有关所有未参加特定课程(由其ID决定)的学生的信息(例如“ SELECT * FROM students”)。

我尝试了以下SQL查询

SELECT * FROM `students` 
LEFT JOIN(
    SELECT * FROM link_student_class
    WHERE class_id = $class_id
    )
link_student_class ON link_student_class.student_id = students.student_id

$ class_id是我要排除的学生的班级ID。

在返回的对象中,我要包括的学生和我要排除的学生的“ class_id”列的值不同。 那些要包含的值为“ NULL”,而我要排除的那些具有一个数值。

3 个答案:

答案 0 :(得分:1)

NOT EXISTS浮现在脑海:

select s.*
from students s
where not exists (select 1
                  from link_student_class lsc
                  where lsc.student_id = s.student_id and
                        lsc.class_id = ?
                 );

?是提供类的参数的占位符。

答案 1 :(得分:0)

您应该检查NULL link_student_class.student_id

SELECT * 
FROM `students` 
LEFT JOIN(
    SELECT * 
    FROM link_student_class
    WHERE class_id = $class_id
) link_student_class ON link_student_class.student_id = students.student_id
where link_student_class.student_id  is null 

答案 2 :(得分:0)

还是NOT IN谓词:

WITH
stud_class(id,stud_id,class_id) AS (
          SELECT 1,   1,1
UNION ALL SELECT 2,   1,2
UNION ALL SELECT 3,   2,1
UNION ALL SELECT 4,   3,3
)
,
stud(stud_id,fname,lname) AS (
          SELECT 1,'Arthur','Dent'
UNION ALL SELECT 2,'Ford','Prefect'
UNION ALL SELECT 3,'Tricia','McMillan'
UNION ALL SELECT 4,'Zaphod','Beeblebrox'
)
SELECT 
  s.*
FROM stud s
WHERE stud_id NOT IN (
  SELECT
    stud_id
  FROM stud_class
  WHERE class_id= 2
);
-- out  stud_id | fname  |   lname    
-- out ---------+--------+------------
-- out        3 | Tricia | McMillan
-- out        4 | Zaphod | Beeblebrox
-- out        2 | Ford   | Prefect
-- out (3 rows)
-- out 
-- out Time: First fetch (3 rows): 9.516 ms. All rows formatted: 9.550 ms