1

私のテーブルからランダムなレコードを表示しようとしていますが、運が悪いので、これは私が持っているものです。これはPHPでコーディングされています

$range_result = mysql_query("SELECT MAX() AS max_id , MIN() AS min_id FROM pages");
$range_row = mysql_fetch_object( $range_result ); 
$random = mt_rand($range_row->min_id , $range_row->max_id);
$result_random = mysql_query( "SELECT * FROM pages WHERE id >= $random LIMIT 0,1");
echo $result_random;

これが明らかな間違いかどうか疑問に思っていますか? データベースに正常に接続しました。

JB

4

3 に答える 3

5

mysqli_multi_queryパフォーマンスのために、ストレート SQL を使用してこれを行う必要があります。

// First query gets the random ID, second gets the associated row
$sql = "SELECT @id:=FLOOR(RAND()*(MAX(id) - MIN(id))) + MIN(id) FROM pages; 
        SELECT * FROM pages WHERE id = @id;"

// Create a mysqli object and execute the multi-query
$mysqli = new mysqli($host, $user, $pass, $db_name);
$mysqli->multi_query($sql);
$result = $mysqli->store_result();

// Grab the first row from the first resultset
if ($row = $result->fetch_assoc()) {
    print_r($row);
}
于 2012-12-07T00:40:15.070 に答える
1

rand() を使用しないのはなぜですか。

"SELECT * FROM pages ORDER BY RAND() Limit 1"

しかし、答えるために、定義されていない場合、最小値と最大値は何を選択していますか? おそらく試してみてください:

"SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM pages"

そして、制限のオフセットは必要ないと思います。したがって、LIMIT 1 だけで十分でしょう。

コメントにあるように、RAND() は大規模なデータ セットでは遅くなる可能性がありますが、多くの場合、これは問題ではなく、例外的な量のデータがない限り、遅延は最小限です。詳細については、frank のリンクを参照してください。個人的には、RAND() の速度で実際に問題が発生したことはありません。

Michael が言ったように、結果セットであると信じているものをエコーする前に、おそらく結果をフェッチするようにしてください。

また、mysql_ 関数は非推奨です。mysqliまたはPDOに切り替える必要があります

于 2012-12-07T00:39:48.417 に答える
0

RAND() で注文する方がはるかに優れていますが、この方法は機能します。問題は、mysql の結果セットをエコーアウトしようとしていることです。コードの後に​​次のようなことを行う必要があります。

$row = mysql_fetch_assoc($result_random);
echo $row['field1'] . " " . $row['field2'];

field1 と field2 は、テーブル内の列の名前です。

于 2012-12-07T00:44:29.697 に答える