【问题标题】:MYSQL WHERE NOT queryMYSQL WHERE NOT 查询
【发布时间】:2017-06-27 16:28:29
【问题描述】:

我正在开展一个项目,教师可以为学生分配徽章,它类似于成就系统。

现在我正在尝试了解没有特定徽章但我使用的查询不起作用的学生的概况。

我创建了一个名为 StudentHasBadge 的表,其中保存了 studentnumberbadge_id

示例: 我想显示没有“英语:阅读”徽章的学生列表(s.studentnumber、s.firstname、s.lastname)。

我使用以下查询:

(英文:Reading has badge_id 61 in my database)

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,但它并没有给我不同的结果

【问题讨论】:

  • 只是为了解释你得到的结果;您的查询要求获得徽章 61 以外的徽章的学生。这包括获得徽章 61 和至少一个其他徽章的学生。至于答案,我支持戈登的;它是最直接的,并且可能具有最好的性能。

标签: mysql sql select where


【解决方案1】:

您可以使用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;

【讨论】:

  • 只是一个问题,你为什么要找一个 0 的学号?
【解决方案2】:

你应该使用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);

【讨论】:

    【解决方案3】:

    不需要“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
    

    【讨论】:

    • 但这并不一定会返回没有徽章的学生
    • 你是对的。我误读了OP的问题。我将他的问题读作“我如何无法获得徽章 ID 61 的值”。在这种特殊情况下,@Gordon Linoff 已经回答了 OP
    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多