一个统计以往数据的SQL。

今天有一位朋友发了这么个场景:一个商店的收入记录表,每天都有记录;

日期 每天收入
07/11 100
07/12 102
07/13 103
07/14 101

 

 

 

 

 

现在做一个统计,用户希望看到自已的收入统计

日期 每天收入
07/11 100
07/12 202
07/13 305
07/14 406

 

 

 

 

 

创建表

CREATE TABLE IF NOT EXISTS `income` (
  `id` int(11) NOT NULL,
  `idate` date DEFAULT NULL,
  `money` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idate` (`idate`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 查询一,数据量在一千以内,还能接受,但数据量大了以后,查询时间超长。

select a.idate ,sum(b.money) as num
from income as a left join income as b 
on b.idate<=a.idate group by a.idate order by a.idate 

expalin 出来的结果

 查询二 和单表查询没什么区别,@rowNum 等于查询记录行之前的所有记录的总和

SELECT id, idate, (@rowNum := @rowNum + money) AS total FROM income, (
SELECT (@rowNum := ifnull( (SELECT sum( money ) FROM income WHERE id <=0 ) , 0)))b 
ORDER BY id limit 0,30                                                                 

expain 出来的结果

同样达到一个目标,不同的SQL差距可以是天地之别。

查询一为什么会这么慢,因为他执行了记录数次(1002)SUM 统计,group by 了N次。

查询二只是比普通查询多了个子查询,根据id 查询顺序值越大,越先执行(3211),先执行子查询,将结果置为 drived表

posted @ 2014-07-23 17:50  蒋坞村长  阅读(197)  评论(0编辑  收藏  举报