2013-11-23 115 views
-1
SELECT date, id, sum(revenue) 
FROM table 
WHERE date between '2013-01-01' and '2013-01-08' 
GROUP BY date, id 
HAVING sum(revenue)>1000 

返回收入> 1000的行。按列聚合高效分组

SELECT date, id, sum(revenue) 
FROM table 
WHERE date between '2013-01-01' and '2013-01-08' 
AND id IN (SELECT id FROM table where date between '2013-01-01' and '2013-01-08' GROUP BY id HAVING sum(revenue)>1000) 
GROUP BY date, id 

根据需要返回id在日期期间总收入大于1000的行。但是这个查询要慢得多。任何更快的方法来做到这一点?

+0

怎么样'EXPLAIN'第一? – zerkms

+0

@ChrisArmstrong这些查询返回不同的结果吗? –

回答

1

确保您对dateid列的索引,并尝试这种变化:

select t.date, t.id, sum(t.revenue) 
from table t 
inner join (
    select id 
    from table 
    where date between '2013-01-01' and '2013-01-08' 
    group by id 
    having sum(revenue) > 1000 
) ts on t.id = ts.id 
where t.date between '2013-01-01' and '2013-01-08' 
group by t.date, t.id 
+0

现代mysql优化器会为它们生成相同的(或*非常相似的*)执行计划 – zerkms

+0

Btw,op不需要*索引*,但是一个复合'(日期,id)'索引。甚至可能是'(date,id,revenue)'索引,值得一试 – zerkms

+0

@zerkms - 你的组合索引不会帮助内部的'GROUP BY'或'JOIN',不过,它只是'id '。不过,这是拆分头发,哪些索引最好取决于数据,并且需要真实世界的测试。我的建议是一个指导方针,而不是一个绝对的。 – RedFilter