2012-07-16 70 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