0

ユーザーの先月のポイントの合計と合計を取得しようとしていますが、1 回のクエリで取得できますか? 私は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 の 1 つのバージョンを次に示します。

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 に答える