MYSQL SELECT SUM()BY DATE如果没有匹配返回0

时间:2012-07-16 12:54:08

标签: php mysql group-by sum where

我已将三张桌子相互连接起来。 我正在查询关键字+统计信息。

我需要按日期范围获取数据,并且 如果没有该特定日期范围的数据 我希望它返回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

3 个答案:

答案 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