0

私は人々が0から10までの単一の番号を投稿できるウェブページを持っています。

1日1回の宝くじの単一番号生成のようなものがあります。PHPスクリプトで、投稿されたすべてのユーザーの数を確認し、相対的な勝者(または敗者)に+1または-1のスコアを割り当てたいと思います。

問題は、勝者のユーザーのリストをDBに照会したら、(「users」テーブルの)「score」フィールドを更新したいということです。私はこのようなループを考えていました(擬似コード)

foreach winner{
    update score +1
}

ただし、これは、勝者が100人の場合、クエリが100人になることを意味します。1つのクエリで何らかのバッチ挿入を行う方法はありますか?

前もって感謝します。

4

3 に答える 3

1

番号の保存方法を指定していません。投稿する人の数が非常に多い場合は、データベースを使用してその数を保存することをお勧めします。

たとえば、、、およびlottoの3つのフィールドで呼び出されるテーブルを作成できます。フィールドに(一意ではない!)インデックスを作成します。posted_numberscoreemailposted_number

create table lotto (posted_number integer(1) unsigned, score integer, email varchar(255), index(posted_number));

スコアを更新するには、次の2つのクエリを実行できます。

update lotto set score = score+1 where posted_number = <randomly drawn number here>
update lotto set score = score-1 where posted_number = <randomly drawn number here>
于 2012-06-27T14:44:45.570 に答える
1

私はあなたがSQLでデータベースを使用していると仮定し、おそらく次のようなことをしたいと思うだろうと提案します

UPDATE `table` SET `score`=`score`+1 WHERE `number`=3;

敗者には対応する-1(奇妙なことに、-1にする理由がわかりません)。

しかし、これ以上の詳細がなければ、私はこれ以上の助けにはなりません。

于 2012-06-27T14:46:15.160 に答える
0

postsとという名前のデータテーブルがあると仮定しましょうusers。明らかにusers、ギャンブラーのデータ(便利なidフィールドとpointsポイント数)をposts含み、post_id行のIDフィールド(user_idユーザーのID)とvalue投稿された番号自体を含みます。

これで、次のSQLクエリをスクリプトに実装するだけで済みます。

UPDATE users INNER JOIN posts ON users.id = posts.user_id SET users.points = (users.points + 1) WHERE posts.value = 0;

最後0にランダムに描かれた数字に置き換えられます。

このクエリは何をしますか?INNER JOINコンストラクトを使用すると、2つのテーブル間にリンクが作成されます自動的に、posts.value私たちの番号と一致する場合、どのユーザーが自分の番号を変更する必要があるかを知って、にリンク posts.user_idします。誰かがギャンブルをし、そのID()がである場合、。を持つユーザーのフィールドが更新されます。users.idpoints0posts.user_id8170pointsuser.id = 8170

クエリを変更して(users.points - 1)WHERE posts.value != 0にすると、勝者以外の人には1ポイントが差し引かれます。好きなだけ微調整できます。

注意してください!毎日描画した後、投稿テーブルを切り捨てるかアーカイブする必要があります。

別のオプションはtime()、番号を賭けているユーザーのタイムスタンプを(PHPで)保存し、実行時に、保存されているタイムスタンプと照合することです...それが当日の始まりと終わりの間にあるかどうか。

ヒント:グラフィカルデータベースソフトウェア(MicrosoftAccessやLibreOfficeBaseJOINなど)を使用して、グラフィカルディスプレイでシミュレーションを行うことができます。初心者にとって、このような質問のモデリングがはるかに簡単になります。デスクトップにインストールされたソフトウェアが必要ない場合は、のインストールを試すことphpMyAdminも別の解決策です。


編集:

非リレーショナルデータベース

非リレーショナルデータベースを使用する場合は、最初に次の方法ですべての勝者をフェッチする必要がありますID

SELECT user_id FROM posts WHERE value=0;

これにより、複数の行の結果が得られます。ここで、この結果を1つずつ確認し、次のクエリを実行する必要があります。

UPDATE users SET points=(users.points + 1) WHERE id=1;

0は抽選された当選番号であり、更新するユーザー1の同時です。)id

MySQLのリレーション機能を使用せずに、MySQLデータベースを使用すると、スクリプトは次のようになります。

<?php
$number = 0; // This is the winning number we have drawn

$result = mysql_query("SELECT user_id FROM posts WHERE number=" .$number);

while ( $row = mysql_fetch_assoc($result) )
{
    $curpoints_result = mysql_query("SELECT points FROM users WHERE user_id=" .$row['user_id']);
    $current_points = mysql_fetch_assoc($curpoints_results);

    mysql_query("UPDATE users SET points=" .($current_points['points'] + 1). " WHERE user_id=" .$row['user_id']);
}
?>

コンストラクトは、結果のwhileすべての行(勝者のリスト)が更新されるまでこのループを実行します。

ああ、そして:MySQLがリレーショナルデータベースであることは知っていますが、それはまさにそれが何であるかです:

于 2012-06-27T15:04:16.343 に答える