Barrankaは彼のコメントで正しい方向に進んでいました。可能な限り、データを複製していないことを確認する必要があります。
ただし、一部の古いユーザースコアに戻すことができるようにしたい場合、または1日を選び出し、特定の時点で誰がトップだったかを確認できるようにする場合、つまり動的レポートを作成する場合は、各レコードを個別に記録する必要があります。デート。SQLを介して既存のユーザーデータから日次スコアを推定し、必要なときにいつでもテーブルに入力できるため、このための個別のテーブルがあると便利です。
あなたが持っている決定は、あなたが履歴に何人のユーザー記録を維持したいか、そしてどれくらいの期間であるかです。「ホットリスト」が上位5人のユーザーになるという考えで、以下を作成しました。CRONジョブまたはスケジュールされたタスクを毎日/月に実行して、挿入を実行し、非常に古いデータをクリーンアップすることもできます。
ユーザー
score_ranking
- id
- user_id(すべてのユーザー情報ではなくidを使用して正規化します)
- score_at_the_time
- date_of_ranking
したがって、単一のデータランキングを生成するには、このテーブルに挿入できます。何かのようなもの:
INSERT INTO
`score_ranking` (`user_id`, `score_at_the_time`, `date_of_ranking`)
SELECT
`id`, `score`, CURDATE()
FROM
`users`
ORDER BY
`score` DESC
LIMIT
5
次に、特定の日付(または日付範囲)のデータを読み取るには、次のようにします。
SELECT * FROM score_ranking
WHERE date_of_ranking = 'somedate'
ORDER BY score_at_the_time DESC