2013-02-24 72 views
0

我试图在上个月和总计中获得用户积分的总和,是否有可能在一个查询中得到它?即时通讯使用zend,但我可以得到它与提供的SQL工作。上个月总计

继承人我总上个月

$select = $this->_db 
      ->select() 
      ->from(array('p' => $this->_name), array(
       'user_login', 
       'sum' => new Zend_Db_Expr('SUM(p.value)'), 
       ) 
      ) 
      ->joinLeft(array('u' => 'user'), 'p.user_login = u.login') 
      ->group('p.user_login') 
      ->where('DATE(when) >= CURDATE() - INTERVAL 30 DAY') 
      ->order('sum DESC') 
      ; 
    return $this->getAdapter()->fetchAll($select); 
+0

总共是什么? – 2013-02-24 14:12:18

回答

1

当我明白这个问题,你要显示的总过去30天,将总时间为每个用户的;可悲的是我无法测试Zend的语法,我不太习惯它,但这里是MySQL的必需SQL的一个版本;

SELECT p.user_login, 
    SUM(IF(DATE(`when`) >= CURDATE() - INTERVAL 30 DAY,p.value,0)) sum, 
    SUM(p.value) total_sum 
FROM user_value p 
JOIN user u 
    ON u.login = p.user_login 
GROUP BY p.user_login 
ORDER BY sum DESC; 

SQLfiddle for testing

+0

SUM(IF(DATE('when')> = CURDATE() - INTERVAL 30 DAY,p.value,0))sum, exatly我在找什么 – 2013-02-24 14:27:51

0

我相信你的初始查询就相当于这个SQL:

SELECT p.user_login, SUM(p.value) as sum_last_month 
FROM person p 
LEFT JOIN user u ON p.user_login = u.login 
WHERE DATE(when) >= CURDATE() - INTERVAL 30 DAY 
GROUP BY p.user_login 
ORDER BY sum_last_month DESC 

我不知道如何做一个嵌套的SELECT这样与Zend,但在SQL我相信这样的事情会的工作:

SELECT p.user_login, SUM(p.value) as sum_last_month, 
    (SELECT SUM(p2.value) FROM person p2 WHERE p2.id = p.id) as total 
FROM person p 
LEFT JOIN user u ON p.user_login = u.login 
WHERE DATE(when) >= CURDATE() - INTERVAL 30 DAY 
GROUP BY p.user_login 
ORDER BY sum_last_month DESC, total DESC