0

テーブルに保存する Web アプリケーションと、以下pointsのテーブルの合計ポイントがあります。user

User Table
user_id | total_points

Points Table
id | date | user_id | points

ユーザーがポイントを獲得するたびに、次のステップが発生します。

1. Enter points value to points table
2. Calculate SUM of the points for that user
3. Update the user table with the new SUM of points (total_points)

ユーザー テーブルの値がポイント テーブルの合計と同期しなくなる可能性があるため、すべてのユーザーのすべてのポイントの合計を時々 (たとえば、月に 1 回) 再計算できるようにしたいと考えています。ユーザー テーブル内の各ユーザーをループしてそのユーザーの合計を見つけ、total_points を更新する PHP スクリプトを作成することもできますが、それは大量の SQL クエリになります。

私がやろうとしていることを行うより良い(効率的な)方法はありますか?ありがとう...

4

3 に答える 3

2

これを行うより効率的な方法は次のとおりです。

User Table
user_id

Points Table
id | date | user_id | points

Total Points View
user_id | total_points

ビューは事実上、テーブルを装った select ステートメントです。select ステートメントは次のようになりますSELECT "user_id", SUM("points") AS "total_points" FROM "Points Table" GROUP BY "user_id"。ビューを作成するには、前の select ステートメントCREATE VIEW "Total Points View" AS <SELECT STATEMENT>である where is を実行します。SELECT STATEMENT

ビューが作成されると、通常のテーブルと同じように扱うことができます。

PS: テーブル名に実際にスペースが含まれていない限り、引用符が必要かどうかはわかりませんが、MySQL を使用してからしばらく経っているので、特異性を覚えていません。

于 2012-12-13T05:43:41.500 に答える
2

これにはトリガーを使用して、ユーザーの合計ポイントをuser_pointsテーブルと同期させる必要があります。何かのようなもの:

Create Trigger UpdateUserTotalPoints AFTER INSERT ON points
FOR EACH ROW Begin
    UPDATE users u
    INNER JOIN 
    (
       SELECT user_id, SUM(points) totalPoints
       FROM points
      GROUP BY user_id
    ) p ON u.user_id = p.user_id
   SET u.total_points = p.totalPoints;
END;

SQL フィドルのデモ

注意: @FireLizzard が指摘したように、2 番目のテーブルのこれらのレコードが頻繁に更新または削除される場合は、2 つのテーブルの同期を保つために、他のAFTER UPDATEおよびトリガーも必要です。AFTER DELETEそして、この場合、 @FireLizzard の方が優れているという解決策です。

于 2012-12-13T06:01:06.493 に答える
0

月に1回欲しいとなると、MySQLだけでは対応しきれません。ここには「ロジック」コードが多すぎます。データベースにロジックを追加するのは正しい方法ではありません。Karan Punamiya のトリガーは良いかもしれませんが、ポイント テーブルに挿入されるたびに user_table が更新されます。

ポイントを削除できるようにしたいという事実については、bsarv の新しい否定された行をポイントに追加するだけで、行を削除しないでください (履歴トレースが壊れます)。

本当に定期的にしたい場合は、それを行う cron スクリプトを実行するか、PHP スクリプトを呼び出すこともできます ;)

于 2012-12-13T05:46:01.783 に答える