2011-12-27 57 views
0

我有以下查詢。JOIN不顯示所有行

SELECT WEEK(Review.created)        AS Week, 
     CONCAT(Employee.firstname, ' ', Employee.lastname) AS Name, 
     AVG(Rating.scale)         AS Average 
FROM employees Employee 
     LEFT JOIN reviews Review 
     ON Employee.id = Review.reviewee_id 
     LEFT JOIN ratings AS Rating 
     ON Rating.id = Review.rating_id 
WHERE Employee.id IN (71, 72) 
GROUP BY WEEK(Review.created), 
      Employee.id 
ORDER BY WEEK(Review.created), 
      Employee.id 

結果是這樣的:

36, Employee1, 2.9091 
37, Employee2, 3.5000 
37, Employee1, 3.7143 
38, Employee2, 4.2000 
38, Employee1, 4.0000 
39, Employee2, 2.0000 
40, Employee2, 2.8333 
40, Employee1, 3.8571 
41, Employee1, 2.6667 
43, Employee2, 2.5000 
43, Employee1, 1.5714 
44, Employee2, 3.8333 
44, Employee1, 4.4000 
45, Employee2, 3.2500 
45, Employee1, 4.8571 
46, Employee2, 2.1667 
46, Employee1, 2.2000 
48, Employee2, 2.6667 
49, Employee2, 1.4000 
49, Employee1, 3.5000 
50, Employee2, 2.0000 
50, Employee1, 1.5000 
51, Employee2, 2.7143 
51, Employee1, 2.7500 

我需要的是返回的員工,即使他們沒有爲這一週的評級。

所以前兩行會返回

36, Employee1, 2.9091 
36, Employee2, NULL 

任何幫助,在此將不勝感激。

+1

您需要外連接到包含所有星期的源。 – 2011-12-27 17:34:01

+0

那麼這意味着我需要創建一個虛擬日曆表? – Jeff 2011-12-27 18:39:12

+0

這將是最有效的方法。你也可以做'DISTINCT WEEK(創建)FROM Review',但我不會建議。 – 2011-12-27 19:03:37

回答

0

變化by子句您的團隊

GROUP BY Employee.id, WEEK(Review.created) 

因爲目前的情況是,如果集團首先在回顧一週,任何對於那周沒有評論的員工將首先按NULL(week(null) -> null)進行分組。

+0

這不起作用。如果數據不存在,則不會顯示在結果中。 – 2011-12-27 17:32:46

+0

員工記錄存在,無論他們是否在任何給定的周內都有評分。 – 2011-12-27 17:33:40

+1

他們想要的是,即使該員工在第36周沒有得到評分,他們希望在結果中顯示「36,Employee2」。「GROUP BY」子句的順序沒有區別,除非這是一個奇怪的MySQL事物。 – 2011-12-27 17:35:53