我已将三张桌子相互连接起来。 我正在查询关键字+统计信息。
我需要按日期范围获取数据,并且 如果没有该特定日期范围的数据 我希望它返回0统计
让我说我的疑问是:
SELECT关键字,SUM(统计)FROM关键字WHERE日期> ='2012-07-10'GROUP BY关键字;
它将返回
|我的关键字1 | 3 |
|我的关键字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作为统计数据。
像这样:
|我的关键字1 | 3 |
|我的关键字2 | 6 |
|我的关键字3 | 0 |
问题是where子句阻塞了未找到的值,是否存在解决方法。
正如我所说我有三个关系表,我使用LEFT JOIN来
查询数据,为简化起见,我将该部分从我的示例查询中删除。
表:活动
ID
命名
表:KeywordGroup
ID
命名
运动
表:KeywordData
ID
关键字
STAT
日期
keywordGroup
答案 0 :(得分:2)
假设您正在使用左连接正确连接表,请使用:
select keyword, ifnull(sum(stat),0) ... group by keyword
如果在应用分组之前过滤掉某些统计数据的WHERE子句,则需要将日期条件移动到LEFT JOIN条件,即
from KeywordGroup left join KeywordData on ... and date > '2012-07-10'
但是如果没有看到实际的查询,我无法进一步帮助。 : - )
答案 1 :(得分: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;
答案 2 :(得分:0)
你看过左外连接吗?以下是连接类型的一个很好的参考:
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
"To produce the set of records only in Table A, but not in Table B,
we perform a left outer join, then exclude the records we don't want
from the right side via a where clause."
<强> NS 强>