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.id
points
0
posts.user_id
8170
points
user.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がリレーショナルデータベースであることは知っていますが、それはまさにそれが何であるかです:例。