【问题标题】:MySQL query returning no results when querying joined table查询连接表时 MySQL 查询不返回任何结果
【发布时间】:2013-10-16 16:53:29
【问题描述】:

我有一个查询要获取一组当天正在运行的测验。我想确保用户尚未完成该测验。我的查询是:

SELECT qi.qiId, qi.qiTitle, qi.qiDescription, qi.qiDate, qi.qiLeague, qi.qiType, qi.qiNumQuestions 
FROM quizzes qi 
LEFT JOIN quizOneDaySpecials qo 
ON qo.qoQuizId = qi.qiId 
AND qo.qoUserId = 11 
WHERE qi.qiLeague = 0 
AND qo.qoIsCompleted != 1 
AND qi.qiDate BETWEEN 1381878000 AND 1381964399

所有测验的详细信息都在quizzes 表中,如果用户已经开始或完成了测验,那么quizOneDaySpecials 中将存在一条记录。但是,如果用户还没有开始测验,quizOneDaySpecials 中将没有记录,这就是我的问题发生的地方。

qo.qoIsCompletedNULL 如果用户还没有开始测验,并且每次我运行我的查询我都没有得到任何结果。如果我取出AND qo.qoIsCompleted != 1,则用户尚未开始的测验按预期返回。

当我签入qo.qoIscompleted != 1 后,为什么我的测验没有返回?它似乎完全有效,它不等于 1,因为它是 NULL

【问题讨论】:

  • 等于 NULL 可能会产生不同的逻辑结果,具体取决于设置...要使其不受设置影响,请尝试将该行更改为 'AND (qo.qoIsCompleted IS NOT NULL AND qo.qoIsCompleted ! = 1)'

标签: mysql sql select left-join


【解决方案1】:

Null 评估为未知,因此不会匹配除 IS NULL 或 IS NOT NULL 之外的任何运算符。您可以在 qoIsCompleted 中添加 OR 语句,也可以使用 IFNULL() 函数来检查它是否为空,如果它是默认值,则该值是否为 0 以便它不匹配。

AND IFNULL(qo.qoIsCompleted, 0) != 1

【讨论】:

    【解决方案2】:

    您不能直接比较 NULL 值和非 null 值。在默认设置下,SQL Server 不知道 NULL 是否等于 1。它只知道它是 NULL。看起来你想要的是像

    WHERE IFNULL(qo.qoIsCompleted, 0) != 1  AND ...
    

    【讨论】:

      【解决方案3】:

      如果我正确理解了您的问题,检查 NULL 与检查值不同。您通过将 OUTER JOIN 包含在您的 WHERE 标准中来否定您的 OUTER JOIN。将该检查移至JOIN,然后在WHERE 条件中检查IS NULL

      SELECT qi.qiId, qi.qiTitle, qi.qiDescription, qi.qiDate, qi.qiLeague, qi.qiType, qi.qiNumQuestions 
      FROM quizzes qi 
          LEFT JOIN quizOneDaySpecials qo 
              ON qo.qoQuizId = qi.qiId 
                  AND qo.qoUserId = 11 
                  AND qo.qoIsCompleted = 1 
      WHERE qi.qiLeague = 0 
          AND qi.qiDate BETWEEN 1381878000 AND 1381964399
          AND qo.qoQuizId IS NULL
      

      【讨论】:

      • 我想就是这样。但它可能需要将AND qo.qoIsCompleted != 1 变为AND qo.qoIsCompleted = 1
      • @ypercube -- 谢谢,我相信你是正确的并且已经编辑了答案 -- 干杯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多