2010-01-17 4 views
2

J'ai cette requête destinée à signaler une base de données MySQL. La requête fonctionne correctement si la sous-requête renvoie un résultat. Cependant, si la sous-requête ne renvoie aucun résultat avec l'erreur 'column lessonId ne peut pas être nul'. Je suppose que c'est logique, mais je ne veux vraiment jamais que le rapport échoue (la date est entrée par l'utilisateur) ... Je veux juste sortir tous les niveaux avec des zéros. Essentiellement, j'ai juste besoin d'ignorer le LEFT JOIN si cette requête ne renvoie aucun résultat.LEFT JOIN échoue lorsque la sous-requête renvoie la valeur null

Alors, comment contourner cela? J'ai essayé une instruction IF, mais je n'arrive pas à la faire fonctionner. S'IL VOUS PLAÎT AIDE :)

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; 

Répondre

0

J'écrirait cette requête de la manière suivante:

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

Ce génie est ... Je pense. Je vais essayer plus tard, mais ça va marcher. Merci beaucoup. – therealsix

+0

Ouais, je ne l'ai pas essayé moi-même, donc on verra si c'est génial ... :-) S'il vous plaît laissez-moi savoir si cela fonctionne ou si elle a besoin d'un peu de réglage. –

+0

Le problème avec ceci est que j'ai besoin d'une fonction d'agrégat dans la sous-requête, j'ai donc besoin du WHERE à l'intérieur. J'avais accidentellement retiré la clause GROUP BY en essayant de simplifier la requête, donc cela n'avait pas beaucoup de sens, mais je l'ai changé maintenant. – therealsix