2013-10-16 207 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