2013-10-16 209 views
0

我有一个查询来获取当天运行的一组测验。我想确保用户尚未完成测验。查询我的是:MySQL查询在查询连接表时返回没有结果

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

+0

等同于NULL可以给不同的逻辑结果,根据设置...使无论它的工作的设置,请尝试更改该行以“AND(qo.qoIsCompleted IS NOT NULL和qo.qoIsCompleted!= 1 )' –

回答

1

空值计算为未知的,因此不会匹配其他任何运营商比IS NULL或IS NOT NULL。你可以为你的qoIsCompleted添加一个OR语句,或者你可以使用IFNULL()函数来检查它是否为null,并且它是否默认值为0,以便它不匹配。

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

太棒了,谢谢。这有助于魅力。 – Styphon

1

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

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

如果我正确理解你的问题,检查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 
+1

我认为就是这样。但它可能需要'AND qo.qoIsCompleted!= 1'成为'AND qo.qoIsCompleted = 1' –

+0

@ypercube - 谢谢,我相信你是正确的,并且已经编辑了答案 - 干杯。 – user2480596