两张表,一张是client,保存的是用户信息。 一张是client_history, 记录了用户的播放时间,成功播放就一次就有一次的记录。这张表里就是起一个LOG的作用,所以有很多用户被删除了,但还是在这张表里有记录。所以现在需要以client表里的所有accountno,查出在client_history里的总播放时间。我现在是按着网上的写法,自己写了一个,但一直结果出不来,一直说在执行,看最后只好用手动给它关掉
SELECT A.accountno,sum(B.duration),B.clientversion FROM client as A, client_history as B
where A.accountno=B.accountno如果有可能,还希望可能显示成最近三个月里,分别在每一个月里的总播放时间.出来的效果像是账号,总播放时间,本月播放总计,上月播放总计, 上上个月播放总计

解决方案 »

  1.   

    从你的描述来看,语句并没有报错,只不过是需要执行很久。如果你的表中记录很多几十万或者上百万,而你的client_history表中又没有合适的索引,这个查询会需要很久的时间。建议重新检查一下你的表中的索引设置。
      

  2.   


    理论上你可以用下面语句来实现,但你的表的记录太多,这个查询时间几乎是不可容忍的。所以一般是每月再生成一次统计结果。
    SELECT A.accountno,
    sum(B.duration),
    sum(if(DATE_FORMAT(播放时间,'%Y%m')=DATE_FORMAT(curdate(),'%Y%m'),  B.duration,0)) as 本月播放总计,
    sum(if(DATE_FORMAT(播放时间,'%Y%m')=DATE_FORMAT(curdate()-interval 1 month,'%Y%m'),  B.duration,0)) as 上月播放总计,
    sum(if(DATE_FORMAT(播放时间,'%Y%m')=DATE_FORMAT(curdate()-interval 2 month,'%Y%m'),  B.duration,0)) as 上上个月播放总计
    FROM client as A, client_history as B
    where A.accountno=B.accountno
    group by A.accountno
      

  3.   

    history 表里确实有上百W的记录,而且没有索引。
    client表里目前只有几千条。那还有没有其它办法来解决?
      

  4.   

    先加上history 表上加accountno索引吧, client表上暂时可以不加。但如果你记录的确很多的话,索引可以提高速度,但也未必能达到你期望的目标。类似这种情况,一般的设计都是再放一张统计结果表,存放每个月的统计。