2011-01-16 11 views
7

次のクエリを使用して、1日あたりのページオープン数を取得しようとしています。左外部結合は左テーブルからすべての行を返しませんか?

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) 
WHERE tracking.open_id = 10 
GROUP BY day.days 

出力、私はそれがこれです取得:

days opens 
1 9 
9 2 

、私の一日のテーブルには、私は月に日を表す30の番号1を含む単一の列を持っていているもの。私は左外部の参加をし、私は日の列にすべての日を表示することを期待しています!

しかし、私のクエリはそれをやっているのですが、それはなぜでしょうか?

ありがとうございました。

答えて

14

接続されたtracking.open_idを10にする必要があります。他の行はNULLになるため、表示されません。

+0

AH!それは理にかなって、ありがとう! – Abs

+0

@Nanneあなたは間違いがあると思います+1 –

43

Nanne's answerここでは、WHERE句を使用して行を削除する理由を説明しますが、修正する方法は説明しません。

ソリューションは、WHEREし、その条件が結合条件ではなく、参加後に適用されるフィルタの一部であることを変更することです:

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking 
ON day.days = DAY(FROM_UNIXTIME(open_date)) 
AND tracking.open_id = 10 
GROUP BY day.days 

を今すぐ左の表のすべての行が中に存在することになります結果。

+1

where節は 'WHERE(tracking.open_id IS NULL or tracking.open_id = 10)'に変更されている可能性がありますが、私はそれが最も理にかなっていると感じるように、そうしました。 – goat

+2

@chris:結合に失敗したときに機能しますが、結合が成功したにもかかわらず結合行の 'tracking.open_id'が10以外の場合には機能しません。この場合も行は削除されます。 –

+0

doh!あなたが正しい。 – goat

関連する問題