0

選択したランダム ユーザーが既に勝者テーブルにある場合、ループ バックして別のランダム ユーザーを選択するには、次のコードが必要です。

以下のコードは機能しますが、勝者のテーブルに既に存在するユーザーをランダムに選択すると、再試行されません。いくつかの方法を試しましたが、うまくいく解決策が見つかりませんでした。

前もって感謝します。(これはスタックオーバーフローに関する私の最初の質問です。プロトコルに従わなかった場合は、簡単にお願いします)

<?php  
$host="localhost";
$user_name="db_user";
$pwd="db_pass";
$database_name="db_name";

$db=mysql_connect($host, $user_name, $pwd);

if (mysql_error() > "") print mysql_error() . "<br>";
mysql_select_db($database_name, $db);
if (mysql_error() > "") print mysql_error() . "<br>";

$sqlCommand = "SELECT userid, firstname, surname, email FROM users ORDER BY RAND() LIMIT 1"; 
$query = mysql_query($sqlCommand) or die (mysql_error());

while ($row = mysql_fetch_array($query)) { 

    $userid = $row["userid"]; 
    $firstname = $row["firstname"];  
    $surname = $row["surname"];  
    $email = $row["email"];

    $checkuserid = mysql_query("SELECT userid from winners WHERE userid=$userid");

    if (mysql_num_rows($checkuserid)==0) {
        $sqlCommand = "INSERT into winners (userid, firstname, surname, email) values ('" . $userid ."','" . $firstname . "', '" . $surname . "', '" . $email . "')";
        mysql_query($sqlCommand) or die (mysql_error()); 
    } else {

    }
} 

mysql_close(); 
header("Location: http://mysite.com"); /* Redirect browser */
exit();
?>
4

4 に答える 4

3

1 つのクエリでこれを行うことができます。

INSERT INTO winners 
    SELECT userid, firstname, surname, email 
    FROM users 
    WHERE userid NOT IN (SELECT userid FROM winners) 
    ORDER BY RAND() 
    LIMIT 1

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に非推奨です赤いボックスがか? 代わりにプリペアド ステートメントについて学び、 PDOまたはMySQLiを使用してください。この記事はどちらを使用するかを決めるのに役立ちます。PDO を選択する場合は、ここに良いチュートリアルがあります。

于 2013-06-26T08:32:38.617 に答える
2

成功するまでループする代わりに、既存の勝者を次のように置き換えることで、サブクエリで除外できます$sqlCommand

$sqlCommand = "SELECT userid, firstname, surname, email ".
              "FROM users ".
              "WHERE userid NOT IN (SELECT userid FROM winners) ".
              "ORDER BY RAND() LIMIT 1"; 
于 2013-06-26T08:31:35.507 に答える
1

最初のクエリを変更して、NOT EXISTS を使用して他のテーブルに存在するユーザーを除外できます。

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

このように見えるはずです

SELECT userid, firstname, surname, email FROM users WHERE NOT EXISTS (SELECT * FROM winners
                WHERE users.userid = winners.userid) ORDER BY RAND() LIMIT 1;

また、制限1のためにループが1つしかなかったため、コードは機能しませんでした

于 2013-06-26T08:30:04.737 に答える
1

ループが必要な場合は、`$sqlCommand' ステートメントのコード フラグメントを別のループ内の while ループの最後に配置します。

于 2013-06-26T08:32:43.550 に答える