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

することは、彼らはその週の格付けを持っていない場合でも、従業員を返すことです。

だから、最初の2行は

36, Employee1, 2.9091 
36, Employee2, NULL 

を返します。この上の任意の助けいただければ幸いです。

+1

すべての週を含むソースに外部結合する必要があります。 –

+0

これは、私はダミーのカレンダーテーブルを作成する必要があることを暗示していますか? – Jeff

+0

それは最も効率的な方法でしょう。 DISTINCT WEEK(作成済み)からReviewを実行することもできますが、私はそれを提案しません。 –

答えて

0

変更句によってあなたのグループを何が起こるか見て最初のレビューを週にあなたがグループであれば、任意のその週のレビューのない従業員は、最初にNULL(week(null) -> null)にグループ化されます。

+0

それは動作しません。データがない場合、結果には表示されません。 –

+0

従業員レコードは、指定した週に評価があるかどうかに関係なく存在します。 –

+1

彼らが望むのは、その従業員が36週目に格付けを得ていなくても、結果に「36、Employee2」が表示されることです。このグループが奇妙なMySQLのものでない限り、GROUP BY句の順序は違いはありません。 –

関連する問題