2011-12-27 55 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