2016-11-25 7 views
0

暦年(例えば、2016年)の月合計登録ユーザを取得しようとしています。クエリには、2015年12月までの以前の登録ユーザを考慮する必要があります。MySQLのフェッチ1ヶ月あたりの総登録ユーザ数

以下の2つの問題があります。 1.新規登録ユーザーがいない行をスキップします。 2.それは、登録済みのユーザーをフェッチします。また、合計ユーザー数をカウントすると、以前に登録されたユーザー数はカウントされません。

SELECT tots.*, @var := @var + tots.`monthlyUsers` as totalUsers 
FROM (
SELECT m.monthNum, 
    YEAR(from_unixtime(u.createdDate)) AS `year`, 
    MONTH(from_unixtime(u.createdDate)) AS `month`, 
    COUNT(*) AS `monthlyUsers` 
FROM user u 
GROUP BY `year`, `month`) AS tots, (SELECT @var := 0) AS inc 

この結果は

year month monthlyUsers totalUsers 
------------------------------------ 
2015 1  2    2 
2016 1  3    5 
2016 10  1    6 
2016 11  2    8 

どのように私はこれらの2つの問題を克服しないようなものでしょうか?

EDIT は私が

SELECT tots.*, @var := @var + tots.`monthlyUsers` as totalUsers FROM (
SELECT 
    YEAR(from_unixtime(u.createdDate)) AS `year`, 
    MONTH(from_unixtime(u.createdDate)) AS `month`, 
    COUNT(*) AS `monthlyUsers` 
FROM user u 
where YEAR(from_unixtime(u.createdDate)) ='2016' 
GROUP BY `year`, `month`) AS tots, (SELECT @var from (select @var :=count(u.id) from user u where year(from_unixtime(u.createdDate)) < '2016') as var) AS inc 

これは私

year month monthlyUsers totalUsers 
------------------------------------ 
2016 1  3    5 
2016 10  1    6 
2016 11  2    8 

をフェッチする前年のレコードを取得し、現在の年のデータに追加し、管理しかし、私の予想結果は

です
year month monthlyUsers totalUsers 
------------------------------------ 
2016 1  3    5 
2016 2  0    5 
2016 3  0    5 
2016 4  0    5 
2016 5  0    5 
2016 6  0    5 
2016 7  0    5 
2016 8  0    5 
2016 9  0    5 
2016 10  1    6 
2016 11  2    8 
2016 12  0    8 
+0

データ型と期待される結果のサンプルデータを追加できますか? DBMSについても言及する。 –

+0

'months'テーブルはどのように見えますか? –

+0

実際に私はそれを削除することを決めたすべての結果を私にフェッチしなかったので、月の数字で月のテーブルを作成しようとしました – gameOne

答えて

0

決しては、FROM句にカンマを使用します。 常には、明示的な適切なJOIN構文を使用します。

SELECT um.*, 
     (@var := @var + COALESCE(um.monthlyUsers, 0)) as totalUsers 
FROM months m LEFT JOIN 
    (SELECT m.monthNum, 
      YEAR(from_unixtime(u.createdDate)) AS `year`, 
      MONTH(from_unixtime(u.createdDate)) AS `month`, 
      COUNT(*) AS `monthlyUsers` 
     FROM user u 
     GROUP BY `year`, `month` 
    ) um 
    ON m.monthNum = um.monthNum CROSS JOIN 
    (SELECT @var := 0) AS inc 
ORDER BY `year`, `month`; 

私は残りのユーザーに追加するかどうかはわかりません。少なくとも一つの問題は、あなたがLEFT JOIN必要があるということです。このクエリはフィルタリングされていないようですが、JOINの条件にはおそらく年も含まれています。

+0

実際に私はすべての結果を私にフェッチしなかったので月の数字で月のテーブルを作成しようとしましたそれを削除することにしました – gameOne

+0

あなたのクエリはすべての月のデータを取得しません – gameOne

+0

@gameOne。 。 。これは、 'months'の各行に対して1つの行をフェッチする必要があります。それはあなたが望む意図のようです。 –

関連する問題