複数のユーザーを一覧表示する 1 つのテーブルと、それらのユーザーが行ったすべてのアクション、アクションを行ったユーザーの ID、およびアクションの日付を一覧表示する別のテーブルの 2 つのテーブルを持つデータベースがあります。
各ユーザーが毎月行ったアクションの数を計算しようとしています。これを効率的に行う方法がわかりません:誰か提案はありますか?
複数のユーザーを一覧表示する 1 つのテーブルと、それらのユーザーが行ったすべてのアクション、アクションを行ったユーザーの ID、およびアクションの日付を一覧表示する別のテーブルの 2 つのテーブルを持つデータベースがあります。
各ユーザーが毎月行ったアクションの数を計算しようとしています。これを効率的に行う方法がわかりません:誰か提案はありますか?
を使用して、との両方MONTH()
から月を抽出します。DATE
GROUP BY
MONTH
USER_ID
SELECT u.user_id, MONTH(a.date), COUNT(*) number_of_actions
FROM users u INNER JOIN actions a ON (u.user_id = a.user_id)
GROUP BY u.user_id, MONTH(a.date)
また、ユーザー アクションが複数の年にまたがり、2011 年 1 月と 2012 年 1 月に異なるカウントが必要な場合は、両方 でグループ化しYEAR
、MONTH
代わりに次のようにします。
SELECT u.user_id, YEAR(a.date), MONTH(a.date), COUNT(*) number_of_actions
FROM users u INNER JOIN actions a ON (u.user_id = a.user_id)
GROUP BY u.user_id, YEAR(a.date), MONTH(a.date)
@Joao Silvaの回答が遅すぎる場合は、更新用のトリガーまたはストアドプロシージャを使用して、別のテーブル内の別のテーブルでアクションが発生するため、カウントを維持できます。ディスク ベースのテーブルが遅すぎる場合は、メモリ テーブルを使用してサーバーの再起動時に再構築するか、Redis インスタンスを使用してこの情報を保持することができます。