查询连接表时,MySQL查询返回无结果

时间:2013-10-16 16:53:29

标签: mysql sql select left-join

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

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办理登机手续时,我的测验不会被退回?它似乎完全有效,它不等于一个,因为它是NULL

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

Nulls评估为未知,因此不会匹配IS NULL或IS NOT NULL以外的任何运算符。您可以向qoIsCompleted添加OR语句,也可以使用IFNULL()函数检查它是否为null,如果默认值为0,则表示它不匹配。

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

答案 2 :(得分:1)

如果我正确理解您的问题,则检查NULL与检查值不同。您在OUTER JOIN条件中将其包括在内,从而否定了WHERE。将该检查移至JOIN,然后在IS NULL条件中检查WHERE

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