2012-07-16 128 views
3

我已經將三個表彼此連接起來。 我在查詢關鍵字+統計信息。MYSQL SELECT SUM()BY DATE IF NO MATCH RETURN 0

我需要得到的數據進行按日期範圍,並 如果沒有數據對於特定日期範圍 我想它返回0統計

比方說我的查詢是:
SELECT關鍵字, SUM(stat)FROM keywords WHERE date> ='2012-07-10'GROUP BY關鍵字;

這將返回
| my keyword 1 | 3 |
| my keyword 2 | 6 |

示例表格內容:
| id |關鍵字| stat |日期| keywordGroup |
| 1 |我的關鍵字1 | 2 | 2012-07-11 | 1 |
| 2 |我的關鍵字1 | 1 | 2012-07-12 | 1 |
| 3 |我的關鍵字2 | 6 | 2012-07-11 | 1 |
| 4 |我的關鍵字3 | 10 | 2012-07-09 | 1 |

但有一些關鍵字沒有該日期範圍的統計信息
但我仍然希望將這些關鍵字顯示爲0作爲統計信息。

像這樣:

| my keyword 1 | 3 |
| my keyword 2 | 6 |
| my keyword 3 | 0 |

問題是where子句阻塞未找到的值,是否有解決方法。
正如我所說我有三個關係表,我使用LEFT JOIN到 查詢數據,爲了簡化,我將這部分留在了我的示例查詢中。

表:廣告系列
ID

表:KeywordGroup
ID

活動

表:KeywordData
ID
關鍵字
統計
日期
keywordGroup

回答

2

假設你joing左連接正確,使用表:

select keyword, ifnull(sum(stat),0) ... group by keyword 

如果是WHERE子句在應用分組之前過濾掉某些統計信息,則需要將日期條件移入LEFT JOIN條件,即。

from KeywordGroup left join KeywordData on ... and date > '2012-07-10' 

但我不禁進一步沒有看到實際的查詢。 :-)

+0

SELECT關鍵字,SUM(STAT)從左路JOIN keywordGroup ON campaigns.id = keywordGroup活動。活動LEFT JOIN keywordData ON keywordGroup.id = keywordData.keywordGroup WHERE keywordData.date> ='2012-07-10'GROUP BY關鍵字 – Jompper 2012-07-16 13:06:50

+0

數據每天都會被插入到keywordData表中,可以說我每天都會記錄Google關鍵字訪問,如果該關鍵字當天沒有訪問,則不會插入任何數據。我仍然需要獲得在我的日期範圍內訪問次數爲0次的關鍵字。嗯,也許我可以像WHERE MAX(日期)<='2012-07-09' – Jompper 2012-07-16 13:12:42

+0

分開查詢那些好,我在這裏看到一個不同的問題。唯一的地方,實際關鍵字文本保存在「keywordData」表中的「關鍵字」列吧? – 2012-07-16 13:13:50

1

試試這個

select 
    t1.keyword, 
    sum(t2.stat) as stat 
from 
( 
    select distinct keyword from keywords 
) as t1 left join 
(
    SELECT keyword,SUM(stat) FROM keywords WHERE date >='2012-07-10' GROUP BY keyword 
) as t2 
on t1.keyword=t2.keyword; 
+0

這會奏效,謝謝! – Jompper 2012-07-16 13:23:42