我已经将三个表相互连接。我在查询关键词+统计数据。
我需要按日期范围获取数据,并且如果没有该特定日期范围的数据我希望它返回0统计
假设我的查询是:
SELECT关键字,SUM(stat)FROM关键字WHERE date>='2012-07-10'GROUP BY关键字
它将返回
|我的关键字1|3|
|我的关键字2|6|
示例表内容:
|id|keyword|stat|date|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
名称
表:关键字组
id
名称
活动
表:关键字数据
id
关键字
统计
日期
关键字组
假设使用左联接正确联接表,请使用:
select keyword, ifnull(sum(stat),0) ... group by keyword
如果是WHERE子句在应用分组之前过滤掉了一些统计信息,那么您需要将日期条件移动到LEFT JOIN条件中,即
from KeywordGroup left join KeywordData on ... and date > '2012-07-10'
但是,如果没有看到实际的查询,我就无能为力了。:-)
试试这个
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;
您看过左外部联接吗?这里有一个很好的连接类型参考:
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