###実現したいこと
t_conversionのデータを一旦ユーザーIDで絞り込み、作成した1日〜31日までの日付テーブルにLEFT JOINし、結合したデータを期間をさらに指定して絞り込みたいと考えています。
1つのSQLで実行しようとするとき、ユーザーIDの絞り込みと期間の絞り込みが2回発生しますが、WHERE句をどのように書けば良いのかわかりません。
VIEWを使って、あらかじめユーザーIDを絞り込んだテーブルを作ってからLEFT JOINさせる方が良いのでしょうか?
もしくは1つのSQL内でWHERE句を上手に書く書く方法はあるのでしょうか?
どちらの方向が良いのかご教授いただければ幸いです。
よろしくお願いいたします。
###該当のソースコード
vw_sequence99
+-------+
| Number |
+-------+
0
1
2
3
4
~
99
t_conversion
+-------+-----------------+
|user_id| conversion_date |
+-------+-----------------+
|001 |2016-05-01
|002 |2016-05-01
|002 |2016-05-03
~
|001 |2016-05-31
SQL
1SELECT ADDDATE('2016-05-01',V.Number ) AS DATE, IFNULL(COUNT(C.conversion_date),0) AS conversion 2FROM vw_sequence99 AS V 3LEFT JOIN t_conversion AS C 4ON ADDDATE('2016-05-01',V.Number ) = DATE(C.conversion_date) 5WHERE ADDDATE('2016-05-01',V.Number) BETWEEN '2016-05-01' AND '2016-05-31' 6GROUP BY ADDDATE('2016-05-01',V.Number)
###試したこと
IFNULL(SELECT COUNT(C.conversion_date) FROM t_conversion WHERE user_id = 001),0)
としてみましたが、上手くいきませんでした。
VIEWの作成
SQL
1DROP VIEW vw_conversion; 2CREATE VIEW vw_conversion AS 3SELECT conversion_date 4FROM t_conversion 5WHERE user_id = 001; 6SELECT ADDDATE( '2016-05-01', V.Number ) AS DATE, IFNULL( COUNT( C.conversion_date ) , 0 ) AS conversion 7FROM vw_sequence99 AS V 8LEFT JOIN vw_conversion AS C 9ON ADDDATE( '2016-05-01', V.Number ) = DATE( C.conversion_date ) 10WHERE ADDDATE('2016-05-01', V.Number) BETWEEN '2016-05-01' AND '2016-05-31' 11GROUP BY ADDDATE('2016-05-01', V.Number)
とすれば期待通りの結果が得られるのですが、viewを使用すべきなのか、WHERE句で同じことができるのか
?疑問です。
回答1件
あなたの回答
tips
プレビュー