3

usersStackoverflowのようなレピュテーションスコアとともにユーザー情報を保存するテーブルがあります。

私の質問は、単一のMySQLクエリで複数のユーザーのレピュテーションを更新する方法です。

これが私のusersテーブルです

user_id  reputation
  1          11
  2         202
  3        3003
  4         444
  5         555

user_id=1がuser_id=4とuser_id=5に反対票を投じたとしましょう。このシナリオでは、user_id = 1のレピュテーションは2ポイントを失い、user_id=4,5は両方とも10ポイントを失います。

その場合、usersテーブルは次のようになります。

user_id  reputation
  1           9 //lost 2 points
  2         202
  3        3003
  4         434 //lost 10 points
  5         545 //lost 10 points

以下に示すMySQLクエリが機能することは知っていますが、ユーザー数UPDATEが可変で投票に依存する場合の一般化可能な解決策を考えています。

UPDATE `users`
 SET `reputation` = CASE
 WHEN `user_id` = '1' THEN reputation - 2
 WHEN `user_id` = '4' THEN reputation - 10
 WHEN `user_id` = '5' THEN reputation - 10
 ELSE `reputation` END
4

1 に答える 1

3

WHEN2 番目をIN()句に置き換えることができます。アプリケーション コードで動的クエリを構築する必要がありますが、API で配列をIN()句に直接バインドできる場合、これははるかに簡単です。

UPDATE `users`
 SET `reputation` = CASE
 WHEN `user_id` = '1' THEN reputation - 2
 WHEN `user_id` IN ('2','3','4') THEN reputation - 10
 ELSE `reputation` END

ただし、これらすべてを 1 つのクエリに強制するのは少し面倒だと思います。-2パフォーマンスが実際の問題でない限り、これはトランザクションにラップされた 2user_id=1つのクエリとして見たいと思い-10ます。

/* Only on InnoDB tables... */
START TRANSACTION;
Update `users` SET `reputation` = `reputation` - 2 WHERE `user_id` = 1;
Update `users` SET `reputation` = `reputation` - 10 WHERE `user_id` IN (2,3,4);
COMMIT;

MySQL トランザクション処理に関するドキュメント...

于 2012-11-11T14:55:03.907 に答える