3

我已经将三个表相互连接起来。我正在查询关键字+统计信息。

我需要按日期范围获取数据,如果没有该特定日期范围的数据,我希望它返回 0 个统计信息

假设我的查询是:
SELECT keyword,SUM(stat) FROM keywords WHERE date >='2012-07-10' GROUP BY keyword;

它将返回
|我的关键字 1|3|
|我的关键字 2|6|

示例表内容:
| 编号 | 关键词 | 统计 | 日期 | 关键词组 |
| 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
名称
活动

表:KeywordData
id
关键字
stat
日期
keywordGroup

4

3 回答 3

2

假设您使用左连接正确连接表,请使用:

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

如果是 WHERE 子句在应用分组之前过滤掉一些统计信息,那么您需要将日期条件移动到 LEFT JOIN 条件中,即。

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

但是如果没有看到实际的查询,我就无法提供进一步的帮助。:-)

于 2012-07-16T13:00:31.763 回答
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;
于 2012-07-16T13:14:45.993 回答
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

于 2012-07-16T13:00:22.450 回答