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);
4

2 回答 2

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

于 2013-02-24T14:20:00.953 回答
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

我不确定如何使用 Zend 进行这样的嵌套 SELECT,但在 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
于 2013-02-24T14:22:59.070 回答