2

私はデータベースの専門家ではありません。私は、カレンダーからユーザーが選択した2つの日付の間のページビューを毎日表示する必要があるプロジェクトに取り組んでいます。私は以下を持っています

次のようなページビューの総数をもたらすSQLクエリ

SELECT DATE_FORMAT(created_at,'%d %b %Y') as this_date, count(*) as Views 
from promotion_insights WHERE f_id = '2' AND p_id = '12' 
AND created_at BETWEEN '2012-08-15' AND '2012-08-19' 
GROUP BY this_date  

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

----------------------
this_date   View
---------------------
15 Aug 2012     3
16 Aug 2012     2
----------------------

カレンダーテーブルとストアドプロシージャもあります。calendarテーブルには、(datefield)という名前の日付の列が1つあります。ストアドプロシージャを呼び出して日付を既に生成しているので、心配する必要はありません。今私が欲しいのは、カレンダーテーブルを持つ上記のテーブル(this_date列とview列)に日付ベースで右結合して、ユーザーが選択した間のall_datesを表示し、ビューが0の日付に0を設定することです。count(*)も0ではなく1を返すことで問題を引き起こしています

私が望む結合によって期待される出力は次のようになります:

----------------------
this_date   View
---------------------
15 Aug 2012     3
16 Aug 2012     2
17 Aug 2012     0
18 Aug 2012     0
19 Aug 2012     0

----------------------

どんな助けでも大歓迎です。

4

2 に答える 2

1

これは、カレンダーテーブルを使用して簡単に行うことができます。ほとんどのデータベースでは良い考えです。

SELECT DATE_FORMAT(c.date,'%d %b %Y') as this_date, count(*) as Views 
from calendar c left outer join
     promotion_insights pi
     on c.date between '2012-08-15' AND '2012-08-19' and
        c.date = pi.created_at
WHERE f_id = '2' AND p_id = '12'
GROUP BY c.date 

注:これは、created_atが日時ではなく日付として格納されていることを前提としています。時間コンポーネントがあると、比較が失敗する可能性があります。

于 2012-09-02T13:01:00.747 に答える
0

SQLでこれを実行する場合は、日付範囲内の各日の行を生成する行ジェネレーターが必要です。次に、生成された行にクエリを結合して、日付範囲内の各日の結果を取得します(範囲内の数日間存在するデータ)。

Oracleを使用している場合は、ALL_OBJECTSまたはを使用DUALして行を生成できます。クエリで使用DATE_FORMATしているので、MySQLを使用しているようです。MySQLで行ジェネレータを作成する方法に関する質問は以前に投稿されました。それは述べています:

これを言うのは嫌いですが、MySQLはこの機能を備えていないビッグ4の中で唯一のRDBMSです。

于 2012-09-02T10:20:52.513 に答える