我有一个包含以下表格的数据库:学生,班级,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”,而我要排除的那些具有一个数值。
答案 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