2016-04-19 8 views
1

私は、カレンダー、従業員、仕事という3つのテーブルを持っています。 従業員は通常、週にタスクを完了し、週末には仕事をしません。私が達成したいことは、テーブルに参加しているので、従業員がいなくても1年で毎日見ることができます。ここでテーブルを結合してヌル値の日付を表示するにはどうすればよいですか?

は私の作品sqlです:

SELECT c.date, t.task, e.name 
FROM calendar c 
    LEFT JOIN tasks t ON (c.date = t.date) 
    INNER JOIN employees e ON (t.emp_id = e.id) 
WHERE c.date >= "2016-01-01" AND c.date <= "2016-01-07"; 

結果は次のようになります。

Date   Task  Name 
... 
2016-01-05 Driving John 
2016-01-05 Cooking Rob 
2016-01-06 Installing Jane 
2016-01-07 null  null 

私の問題は、私はWHERE句(WHERE e.name in("John", "Rob", "Jane"))に従業員を追加するときにということ、です、最後の行(2016-01-07 null null)が消えます。

結果に従業員やタスクのない日付を保存するために変更する必要はありますか?最終報告のためにこれらの日付が必要です。

+1

なぜこの奇妙な日付ですか? ( '... AND c.date <=" 20016-01-07 "') – jarlh

+0

私はこのクエリが上記の結果を返すとは思わない。 – Strawberry

+0

コメントをいただきありがとうございます。 – StefanK

答えて

1

他の回答は右です。内部結合を左結合に変えて、従業員のいない日数を返します。

WHERE c.date between "2016-01-01" and "2016-01-07" 
AND (e.name in("John", "Rob", "Jane") or e.name is null) 
+0

ありがとう、これは私が欲したのと同じように動作します:) – StefanK

1

従業員の内部結合を左結合に変更し、名前句をwhere句ではなくjoin句に入れます。

+0

の年にタイプミスを修正しました。ありがとうございました。左の結合を変更して、クエリ用のフィルタを含めることができませんでした。つまり、これも同様に機能します。 – StefanK

0

この日付を覚えておいてください。

SELECT c.DATE 
    ,t.task 
    ,e.NAME 
FROM calendar c 
LEFT JOIN tasks t ON (c.DATE = t.DATE) 
LEFT JOIN employees e ON t.emp_id = e.id 
    AND e.NAME IN ('John' ,'Rob','Jane') 
WHERE c.DATE >= "2016-01-01" 
    AND c.DATE <= "2016-01-07"; 
関連する問題