2017-08-30 1 views
0

過去1週間に少なくとも1回ログインしたユーザーを取得したいと思っていますが、毎日個別に計算されるようにしたい週番号でグループ化することはできません。過去7日間に1日に少なくとも1回ログインしたユーザーの数

マイcrm_login_infoテーブル構造は以下のようになります。

user_id (INT) | login_time (DATETIME) 
      1 | 2017-08-10 14:32:25 
      2 | 2017-08-11 14:32:25 
      3 | 2017-08-11 14:32:25 
      2 | 2017-08-13 14:32:25 
      3 | 2017-08-14 14:32:25 
      4 | 2017-08-15 14:32:25 
      5 | 2017-08-15 14:32:25 
      2 | 2017-08-18 14:32:25 
      1 | 2017-08-19 14:32:25 
      3 | 2017-08-20 14:32:25 
      5 | 2017-08-20 14:32:25 
      2 | 2017-08-21 14:32:25 
      3 | 2017-08-22 14:32:25 

私は2つのインデックスを持っている - 1ペアuser_idlogin_timeであり、第二はlogin_timeだけです。

データの上記セットの場合と出力これらの線に沿って何か私は何を達成しようとしていることは機能である

、:

:私はすでに動作するようになっているクエリを思い付いた

2017-08-10 | 1 
2017-08-11 | 3 
2017-08-12 | 3 
2017-08-13 | 3 
2017-08-14 | 3 
2017-08-15 | 5 
2017-08-16 | 5 
2017-08-17 | 4 
2017-08-18 | 4 
2017-08-19 | 5 
2017-08-20 | 5 
2017-08-21 | 5 
2017-08-22 | 4 

SELECT DISTINCT(DATE_FORMAT(`login_time`,'%Y-%m-%d')) AS date1, (
SELECT COUNT(DISTINCT `user_id`) 
FROM crm_login_info 
WHERE `login_time` > DATE_SUB(date1, INTERVAL 6 DAY) AND `login_time` <= 
DATE_ADD(date1, INTERVAL 1 DAY)) AS distinct1 
FROM crm_login_info 
ORDER BY date1 ASC 

が、まず第一に、それは、下のクエリでdate1を使用することについて私に警告を与えている、第二は、私はこの全体のクエリの前EXPLAINを実行すると、それはdistinct1サブクエリは、すべてのインデックスを使用していないことを私に伝えていることであると私は怖いですそのこと 非常に長いテーブル(〜7m行)であり、公正であるためには、WHERE login_time > '2017-08-28'でデータを切り捨ててもそのクエリを終了することはできませんでした。

過去のデータが変更されないため、何百ものクエリ(毎日1回)で分割して保存することができますが、私は欲しくないので、もっと動的なソリューションを探しています単一のstatのためだけに別のファイル/テーブルをdbに追加することで、私のシステムの複雑さをさらに増やすことができます。

私はすでにソリューションをオンラインで探していましたが、私の場合に役立つものは見つかりませんでした。ご提供いただけるお手伝いをありがとうございます。さらに詳しい説明が必要な場合は、コメントを通じてお気軽にお問い合わせください。

EDIT:少なくとも過去1年間、過去の日々、その日のデータが生成されるようにします。さらに具体的には、個の別個のユーザーがログイン日数ではなく過去7日間にログインしたいと考えています。過去の日にも同様に生成したいと考えています。例えば、2017-08-22の場合、別のuser_id秒これらの日付を含む範囲2017-08-162017-08-22

+0

明確にしてください:過去1週間または過去1年間ですか? – Pharaoh

+0

少なくとも1年前から過去7日間にログインしたユーザーの数は、少なくとも1年前からの数字です。 –

+0

これは正直なところ、mysql(または他のクエリ言語)の仕事のようです。 @Pharaohの答えのようにクエリの結果を取得してから、このクエリの結果から必要な結果を数えるだけです。プログラミングラングの単純なループです。 – Drecker

答えて

0

GROUP BYクエリを試しましたか?

SELECT DATE_FORMAT(login_time, '%Y-%m-%d') date1, count(DISTINCT user_id) 
FROM login_info 
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY) 
GROUP BY DATE(login_time) 
ORDER BY date1 DESC 
+0

毎日ログに記録されたユーザーは、1ではなく7とカウントされますか?また、一週間前の何日前? –

+0

Eh? 'COUNT(*)'の代わりに 'COUNT(DISTINCT user_id)'が表示されますが、そうでなければこのクエリはうまく動作すると思います。 – Drecker

+0

@Drecker OPは、今日の訪問ではなく、毎日の「過去7日間の訪問」をカウントしたいと考えています(これは、集計された行だけをカウントするため、毎日7を記録しています)。それにもかかわらず、DISTINCTについての発言は正しいですが、私はそれを変更しました。 – Pharaoh

関連する問題