0

製品データベースから一意のIDでランダムな行を選択したいと思います。すべてのページに3〜4個のランダムな製品が必要です...

これが私が始めた方法です

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `products` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `products` WHERE id = $offset LIMIT 1" );
$n=mysql_num_rows($result);

if ($n>0){
    while($row = mysql_fetch_array($result)){ 
        $id = $row["id"];
        $cod_produs = $row["cod_produs"];
        $nume_produs = $row["nume_produs"];
        $titlul_paginii = $row["titlul_paginii"];
        $nume_intermediar = str_replace (" ", "-", $nume_produs);
        $nou_nume_produs = strtolower($nume_intermediar);
        $detalii = $row["detalii"];
        $seo_descriere = $row["seo_descriere"];
        $materiale = $row["materiale"];
        $numere = $row["numere"];
        $pret = $row["pret"];
        $categorie = $row["categorie"];
        $subcategorie = $row["subcategorie"];
        $data_adaugare = strftime("%b %d, %Y", strtotime($row["data_adaugare"]));

    }

echo ("The id of the product is ".$id." and his name is ".$nume_produs);

    };
  ?>

問題は、私のコードが時間の経過とともに削除したIDを返すことです...どうすればそれを防ぐことができますか?

そして、どうすれば一度に3つまたは4つの一意のIDを返すことができ、これを行うためのより良い方法を受け入れることができますか?

4

2 に答える 2

3

通常の方法は次のとおりです。

SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;

MySQLデータベーステーブルからのランダムレコードの選択で説明を読むことができます。

あなたのコードの場合:

mysql_query( " SELECT * FROM `products` ORDER BY RAND() LIMIT 0,3" );

OPコメントを編集

次に、データのサブセットを取得できます。コードの変更:

$offset_result = mysql_query( "SELECT FLOOR(MAX(id) * RAND() - 1000) AS `offset` 
                               FROM `products` ");
$offset_row = mysql_fetch_object( $offset_result ); 
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `products` 
                         WHERE id between $offset and $offset + 1000
                         ORDER BY RAND() 
                         LIMIT 0,3" );

そして、迅速な解決策は、3つのランダムIDを取得することです。

$randoms_id = '-1';
for($i=0;$i<3;$i++) {

  $id_result = mysql_query( " SELECT id FROM `products` 
                              WHERE id >= 
                                  (SELECT FLOOR( MAX(id) * RAND()) 
                                   FROM `products` ) 
                              ORDER BY id LIMIT 1;");
  $id_row = mysql_fetch_object( $id_result ); 
  $id = $id_row->id;

  $randoms_id = $randoms_id . ',' . $id;
}
$result = mysql_query( " SELECT * FROM `products` 
                         WHERE id in ($randoms_id);")
于 2012-08-28T12:47:25.690 に答える
1

スクリプトに誤りがあります。次のようにしてください。

$offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM `products`");
$offset_row = mysql_fetch_object($offset_result); 
$offset = $offset_row->offset;
$result = mysql_query("SELECT * FROM `products` LIMIT $offset, 1");
$n=mysql_num_rows($result);

ただし、これは1つのレコードのみを返します。連続したレコードを取得することも、何度も実行する必要があることもあります。

$offset_result = mysql_query("SELECT COUNT(*) AS total FROM `products`");
$offset_row = mysql_fetch_object($offset_result); 

$total = (($offset_row->total) - 1);
$range_arr = range(0, $total);
shuffle($range_arr);
$off_1 = $range_arr[0];
$off_2 = $range_arr[1];
$off_3 = $range_arr[2];

$result = mysql_query(" (SELECT * FROM `products` LIMIT $off_1, 1)
                        UNION
                        (SELECT * FROM `products` LIMIT $off_2, 1)
                        UNION
                        (SELECT * FROM `products` LIMIT $off_3, 1)");
$n=mysql_num_rows($result);
于 2012-08-28T13:05:16.997 に答える