1

MySQL と PHP を使用して、2 つの列userscore.

週に 1 回、ランキング スクリプトを再実行し、各ユーザーのスコアを計算します。

  • 多くのユーザーが新しいスコアを持っています
  • しない人もいます
  • テーブルに追加する新しいユーザーがいる場合があります

MySQL でこれにアプローチする最良の方法は何ですか? update新しい行を追加する必要がある場合は機能しますか? insertテーブル全体をもう一度挿入できるように、既存の行をオーバーライドしますか? テーブルを削除して、最初から書き直すのが最善でしょうか?

**Sample Data**

User01   2500
User02   3000
User03    100

**New Data to be Added**

User01   2700
User02   4000
User04   1000 // new account

何千人ものユーザーを除いて...

4

3 に答える 3

1

このREPLACE ... INTO構文は、必要に応じて新しい行を挿入し、既存の行に対して削除 + 挿入を行います。

# deletes existing and inserts new row:
REPLACE INTO users SET score = 2000, username = 'User01';
# deletes existing and inserts new row
REPLACE INTO users SET score = 3000, username = 'User02';
# inserts new row
REPLACE INTO users SET score = 4000, username = 'User04';  

http://dev.mysql.com/doc/refman/5.0/en/replace.html

ただし、私のお気に入りの方法はON DUPLICATE KEY構文を使用することです。主に、行を削除してから再挿入すると、既存の行を更新するよりも「費用がかかる」と常に想定していたためです。usernameフィールドがUNIQUEまたはインデックスであると仮定するとPRIMARY KEY、次のことができます。

# Updates existing User01 row
INSERT INTO users SET score = 2000, username = 'User01' ON DUPLICATE KEY UPDATE score = 2000;
# Updates existing User02 row
INSERT INTO users SET score = 3000, username = 'User02' ON DUPLICATE KEY UPDATE score = 2000;
# Inserts new User04 row
INSERT INTO users SET score = 4000, username = 'User04' ON DUPLICATE KEY UPDATE score = 2000;

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

于 2010-09-19T03:20:03.263 に答える
0

INSERTは既存の行を上書きしませんが、代わりにエラーを生成します(たとえば、ユーザー列を一意としてマークし、既存のユーザーを追加しようとした場合)。同様に、UPDATEは新しい行を挿入せず、既存の行を変更するだけです。

ほとんどのユーザーが更新を必要とし、削除する必要のあるユーザーがいる場合、つまり新しいスコアテーブルに含まれなくなった場合、テーブル全体を削除して書き直すことは許容できる解決策のように思われます。

それ以外の場合は、テーブルを更新します。

移植可能な解決策は、キー(つまりユーザー)が(SELECTを介して)テーブルにすでに含まれているかどうかを確認し、存在しないキーにはINSERTを使用するか、既存のキーにはUPDATEを使用することです。もちろん、制約違反エラーが発生した場合は、INSERTを試してエラーコードを確認し、UPDATEに戻ることもできます。

MySQLでは、次の構文を使用して、単一のクエリのみで操作できるようにすることもできます。

INSERT INTO ... ON DUPLICATE KEY UPDATE score = ...

ただし、これは移植性がなく、他のRDBMSでは機能せず、MySQLでのみ機能します。

于 2010-09-19T02:35:24.710 に答える
0

あなたが双方向に言及するように

更新または挿入

INSERTは更新よりも良いと思います。挿入の場合、1つのクエリを追加します。更新に関しては、ユーザーごとに2つのクエリを実行する必要があります。最初にユーザーを選択し、次にuserIdに基づいて更新します。

したがって、最速は挿入であり、SQLクエリを使用していつでも合計できます。

于 2010-09-19T02:38:35.493 に答える