過去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_id
とlogin_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-16
〜2017-08-22
。
明確にしてください:過去1週間または過去1年間ですか? – Pharaoh
少なくとも1年前から過去7日間にログインしたユーザーの数は、少なくとも1年前からの数字です。 –
これは正直なところ、mysql(または他のクエリ言語)の仕事のようです。 @Pharaohの答えのようにクエリの結果を取得してから、このクエリの結果から必要な結果を数えるだけです。プログラミングラングの単純なループです。 – Drecker