2

mySQLの総ユーザー数

月ごとのグループ化

月ごとにグループ化された登録ユーザーの総数を一覧表示したい

さて、これについての難しさは、私が月 ごとのカウントを望まないということですが、その月までの(そしてそれを含む)ユーザーの総数を望んでいます。

ユーザーテーブルの構造

+---------------+--------------+------+-------------------+----------------+
| Field         | Type         | Null | Default           | Extra          |
+---------------+--------------+------+-------------------+----------------+
| ID            | int(11)      | NO   | NULL              | auto_increment |
| email         | varchar(225) | NO   | NULL              |                |
................................-CUT-.......................................
| registered    | timestamp    | NO   | CURRENT_TIMESTAMP |                |
+---------------+--------------+------+-------------------+----------------+

サンプルデータ

1 example1@mail 2012-04-04 xx:xx:xx
2 example2@mail 2012-05-04 xx:xx:xx
3 example3@mail 2012-05-04 xx:xx:xx

優先出力

+------+-------+-------+
| Year | Month | Count |
+------+-------+-------+
| 2012 | 01    | 0     |
| 2012 | 02    | 0     |
| 2012 | 03    | 0     |
| 2012 | 04    | 1     |
| 2012 | 05    | 3     |
+------+-------+-------+

NULLの結果は必要ありません。

どうすれば純粋なmySQLでその結果を達成できますか?

4

3 に答える 3

3

私はこれを試していませんが、これらの線に沿った何かが機能するはずです-

SELECT tots.*, @var := @var + tots.`count`
FROM (
    SELECT
        YEAR(registered) AS `year`,
        MONTH(registered) AS `month`,
        COUNT(*) AS `count`
    FROM user
    GROUP BY `year`, `month`
) AS tots, (SELECT @var := 0) AS inc
于 2012-04-04T17:35:48.657 に答える
0

このアプローチでは、登録が行われたすべての月の最初の日が最初に取得されます。次に、その月の初日を超える登録を行ったすべてのユーザーに参加し、ユーザー数をカウントします。

SELECT
    YEAR(dates.first_day_of_month) AS registration_year,
    MONTH(dates.first_day_of_month) AS registration_month,
    COUNT(u.ID)
FROM (
    SELECT DISTINCT
        DATE_SUB(
            DATE_ADD(
                DATE_SUB(registered,INTERVAL (DAY(registered)-1) DAY), 
            INTERVAL 1 MONTH), 
        INTERVAL 1 SECOND) first_day_of_month
    FROM user 
) dates 
    LEFT JOIN user u ON u.registered <= dates.first_day_of_month
GROUP BY dates.first_day_of_month

登録が発生しなかった月のギャップを回避したい場合は、サブクエリを既存の「数値」テーブルを使用した別のサブクエリに置き換えて、すべての可能な月のリストを取得できます。

于 2012-04-04T17:41:43.843 に答える
0

いくつかのユーザー変数を使用してこれを行うことができます。

set @c = 0;
set @d = 0;
select y, m, @d := @d + Count as Count from
  (select year(registered) as y, 
     month(registered) as m, 
     @c := @c + count(*) as Count
   from user
   group by y,m) as t;

あなたにあげる

+------+------+-------+
| y    | m    | Count |
+------+------+-------+
| 2011 |    1 |  2455 | 
| 2011 |    2 | 14253 | 
| 2011 |    3 | 42311 | 
于 2012-04-04T17:44:22.393 に答える