2013-02-24 84 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