次の表を検討してください。
tweets daterange
--------------------------- ----------------
tweet_id nyse_date class _date
--------------------------- ----------------
1 2011-03-12 2 2011-03-11
2 2011-03-12 1 2011-03-12
3 2011-03-12 1 2011-03-13
4 2011-03-12 1 2011-03-14
5 2011-03-12 0 2011-03-15
7 2011-03-13 1
8 2011-03-13 2
9 2011-03-13 3
10 2011-03-14 3
各ツイートには、1、2、または3のいずれかの「クラス」が割り当てられています。データ範囲内の各クラスの各クラスのツイート数の概要が必要です。2011-03-11
したがって、とに関するツイートはありませんが2011-03-15
、次のように、その日付を結果セットに含める必要があります。
nyse_date total class1 class2 class3
-----------------------------------------
2011-03-11 0 0 0 0
2011-03-12 5 3 1 0
2011-03-13 3 1 1 1
2011-03-14 1 0 0 1
2011-03-15 0 0 0 0
次のクエリを試しましたが、タイムアウトになります(データベースがそれほど大きくないため、タイムアウトするはずがありません)。
SELECT
t.nyse_date,
COUNT(CASE WHEN t.nyse_date = d._date THEN 1 END) total,
SUM(t.class=1) as neu,
SUM(t.class=2) as pos,
SUM(t.class=3) as neg
FROM tweets t
CROSS JOIN
daterange d
GROUP BY t.nyse_date
ORDER BY t.nyse_date ASC
これがEXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
---------------------------------------------------------------------------------------------------
1 SIMPLE d ALL NULL NULL NULL NULL 148 Using temporary; Using filesort
1 SIMPLE t ALL NULL NULL NULL NULL 560783 Using join buffer
私は何が間違っているのですか?日付範囲テーブルのすべての日付が含まれていることを確認するためのより効率的な方法はありますか?
edit
:私もこのクエリを試しましたが、結果は同じままです-タイムアウトするまで実行されます。
SELECT
t.nyse_date,
COUNT(t.tweet_id) AS total,
SUM(t.class=1) AS neu,
SUM(t.class=2) AS pos,
SUM(t.class=3) AS neg
FROM tweets t
LEFT JOIN
daterange d
ON t.nyse_date = d._date
GROUP BY t.nyse_date
ORDER BY t.nyse_date ASC
これがEXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
-------------------------------------------------------------------------------------------------
1 SIMPLE t ALL NULL NULL NULL NULL 560783 Using temporary; Using filesort
1 SIMPLE d ALL NULL NULL NULL NULL 148