2009-07-29 5 views
0

J'ai deux tables dans une base de données MySQL, des cours et des sessions. J'essaie de résumer les entrées dans les sessions pour chaque cours chaque mois.Comment limiter une jointure lorsque la deuxième table n'a pas de lignes pertinentes

Je peux résumer les séances au total pour chaque cours, pas de problème en utilisant cette requête:

SELECT courses.CourseID, 
    SUM(IF(sessions.Duration IS NULL , 0, sessions.Duration)) AS Hrs 
    FROM courses 
    LEFT JOIN sessions ON courses.CourseID = sessions.CourseID 
    WHERE courses.TrainerID = 113 
    GROUP BY courses.CourseID 

Le problème est que tous les cours ont des sessions, donc si je tente de limiter la requête comme en ajoutant ceci après la clause WHERE:

AND sessions.SessionDate >= '2009-06-01' AND sessions.SessionDate <= '2009-06-30' 

je reçois seulement des cours qui ont des sessions, mais ce que je veux est les cours sans sessions pour montrer 0.

J'espère que cela fait se nse.

Quelqu'un peut-il aider? Merci.

Répondre

2

ajouter le prédicat à la condition de jointure ...

SELECT courses.CourseID,  
    SUM(IF(sessions.Duration IS NULL , 0, sessions.Duration)) AS Hrs  
FROM courses 
    LEFT JOIN sessions 
    ON courses.CourseID = sessions.CourseID 
     And sessions.SessionDate 
       Between '2009-06-01' And '2009-06-30' 
Where courses.TrainerID = 113  
GROUP BY courses.CourseID 

Aussi, ne MySql ont Coalesce opérateur? Si oui, vous pouvez changer pour:

SELECT courses.CourseID,  
    SUM(Coalesce(sessions.Duration, 0)) AS Hrs  
FROM courses 
    LEFT JOIN sessions 
    ON courses.CourseID = sessions.CourseID 
     And sessions.SessionDate 
       Between '2009-06-01' And '2009-06-30' 
Where courses.TrainerID = 113  
GROUP BY courses.CourseID 
Questions connexes