2014-01-13 40 views
0

我有一个具有以下字段的表:替代MySQL查询在子查询总结

date,amount,status 

和我有每天(引)同时返回的款额,以及只有查询给定状态的总和(SOLD)。

这很慢,我试图重写查询没有成功。

原来的查询是:

SELECT 
    YEAR(FROM_UNIXTIME(date)) as Year, 
    lpad(MONTH(FROM_UNIXTIME(date)), 2, 0) as Month, 
    lpad(DAY(FROM_UNIXTIME(date)), 2, 0) as Day, 
    (SELECT 
      sum(amount) 
     FROM 
      mytable 
     where 
      status = 'SOLD' 
       and YEAR(FROM_UNIXTIME(date)) = Year 
       and lpad(MONTH(FROM_UNIXTIME(date)), 2, 0) = Month 
       and lpad(DAY(FROM_UNIXTIME(date)), 2, 0) = Day) as Sold, 
    (SELECT 
      sum(amount) 
     FROM 
      mytable 
     WHERE 
      YEAR(FROM_UNIXTIME(date)) = Year 
       and lpad(MONTH(FROM_UNIXTIME(date)), 2, 0) = Month 
       and lpad(DAY(FROM_UNIXTIME(date)), 2, 0) = Day) as Quoted 
FROM 
    mytable 
group by Year , Month , Day 

输出看起来像这样(年月日SUM):

2013  12   01   3442.00 

有没有更好的方式来写这个所以它立即执行?表中的记录少于10,000条。

+0

对于初学者来说,我会分裂的年,月,日场的日期,因为这些都需要大量的。 – tehvan

回答

0

可以至少避免子查询

SELECT 
    YEAR(FROM_UNIXTIME(date)) as Year, 
    lpad(MONTH(FROM_UNIXTIME(date)), 2, 0) as Month, 
    lpad(DAY(FROM_UNIXTIME(date)), 2, 0) as Day, 
    SUM(case 
     when status = 'SOLD' then amount 
     else 0 end) Sold, 
    sum(amount) as Quoted 
from 
    mytable 
GROUP BY Year , Month , Day 
+0

这就是现货。谢谢Raphaël! – lilbiscuit