我正在开展一个项目,教师可以为学生分配徽章,这与成就系统相似。
现在我试图概述那些不具备特定徽章的学生,但我使用的查询无效。
我创建了一个名为StudentHasBadge的表,其中保存了studentnumber
和badge_id
。
实施例: 我想要显示一个学生名单(s.studentnumber,s.firstname,s.lastname),这些学生没有英语:阅读"徽章。
我使用以下查询:
(英文:Reading在我的数据库中有badge_id 61)
SELECT DISTINCT s.studentnumber, s.firstname, s.lastname
FROM students s INNER JOIN student_has_badge shb
ON s.studentnumber = shb.studentnumber
WHERE NOT shb.badge_id = 61
结果我也得到了获得徽章的学生
我也尝试过!=
代替WHERE NOT
,但它并没有给我一个不同的结果
答案 0 :(得分:3)
您可以使用LEFT JOIN
并检查不匹配:
SELECT s.studentnumber, s.firstname, s.lastname
FROM students s LEFT JOIN
student_has_badge shb
ON s.studentnumber = shb.studentnumber AND shb.badge_id = 61
WHERE shb.studentnumber IS NULL;
答案 1 :(得分:1)
您应该使用NOT EXISTS
:
SELECT s.studentnumber, s.firstname, s.lastname
FROM students s
WHERE NOT EXISTS(SELECT 1 FROM student_has_badge
WHERE studentnumber = s.studentnumber
AND badge_id = 61);
答案 2 :(得分:-1)
不要用NOT这个词。只是参数<>或=!
SELECT DISTINCT s.studentnumber,
s.firstname,
s.lastname
FROM students s
JOIN student_has_badge shb ON s.studentnumber = shb.studentnumber
WHERE
shb.badge_id <> 61