2010-01-17 69 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