2013-11-23 111 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