2010-01-17 68 views
2

我有這個查詢用於報告MySQL數據庫。如果子查詢返回一些結果,則查詢工作正常。但是,如果子查詢返回錯誤'column lessonId不能爲空'的結果。我想這是合乎邏輯的,但我真的不希望報告失敗(日期是由用戶輸入的)...我希望它只輸出零的所有級別。基本上我只是需要它忽略LEFT JOIN,如果該查詢返回沒有結果。當子查詢返回NULL時,LEFT JOIN失敗

那麼我該如何解決這個問題?我嘗試了一個IF語句,但我無法得到它的工作。請幫助:)

SELECT Level.name as levelName,Lesson.name as lessonName, num_at_level 
FROM Level 
INNER JOIN 
    `Lesson` 
ON Lesson.LevelId = Level.id 
LEFT JOIN 
    (SELECT lessonId as lessonId, count(*) as num_at_level 
    FROM `has_Lesson` 
    WHERE dateStarted <= '2010-01-09' 
    GROUP BY lessonId 
) as t_num_at_level 
ON lessonId= Lesson.id; 

回答

0

我會以下列方式編寫這個查詢:

SELECT v.name AS levelName, l.name AS lessonName, 
    COUNT(h.dateStarted) AS num_at_level 
FROM Level v 
INNER JOIN Lesson l 
    ON v.id = l.LevelId 
LEFT JOIN has_Lesson h 
    ON l.id = h.lessonId AND h.dateStarted <= '2010-01-09' 
GROUP BY v.id, l.id; 
+0

那是天才......我想。我會在稍後嘗試,但看起來像會起作用。非常感謝。 – therealsix 2010-01-18 13:32:52

+0

是的,我沒有自己嘗試過,所以我們會看看它是不是天才...... :-)請讓我知道它是否有效,或者是否需要進行微調。 – 2010-01-18 14:31:15

+0

這個問題是因爲我需要子查詢中的聚合函數,所以我需要內部的WHERE。 我不小心拿出了GROUP BY子句試圖簡化查詢,所以它沒有多大意義,但我現在改變了它。 – therealsix 2010-01-18 22:08:10