5

画像でいっぱいのデータベースがあり、2 つのランダムな画像を吐き出して表示したいと考えています。このコードはそれを適切に実行しますが、特にデータベースに最終的に多くの行が含まれる場合は、これが最善の方法であるとは確信していません。MySQL の rand() 関数を使用して結果を 2 つに制限することを検討しましたが、大規模なデータベースでは rand() が比較的遅いことがわかりました。もう 1 つの問題は、二重データベース クエリにあります。img_id で 2 つのランダムな行を選択するより良い方法はありますか?

img_id は auto_incremented 行ですが、連続しているとは想定できません。

//get all image ids
$query = $conn->prepare('SELECT img_id FROM images');
$query->execute();
$result = $query->fetchAll();

//create an array in which to put all the ids
$list_imgs = array();

//put the ids into the array to search over
for ($x=0; $x < count($result); $x++) {
    array_push($list_imgs, $result[$x]['img_id']);
}

//output two random images
for ($x=0; $x < 2; $x++) {
    //create random index for search
    $rand = array_rand($list_imgs);

    //query to select one image
    $query = $conn->prepare('SELECT title, file_loc FROM images WHERE img_id=?');
    //random index value in array of img_ids
    $query->execute(array($list_imgs[$rand]));
    $result = $query->fetchAll();

    echo 'title:' . $result[0]['file_loc'] . '<br /><img src="' . $result[0]['file_loc'] . '" />';
}

クエリをより効率的にするための提案はありますか?

4

5 に答える 5

6

あなたが使用できる

SELECT img_id, title, file_loc FROM images order by rand() limit 2

だからあなたはで終わるだろう

$query = $conn->prepare('SELECT img_id, title, file_loc FROM images order by rand() limit 2');
$query->execute();
$result = $query->fetchAll();

foreach($result as $row) {
    echo 'title:' . $row['file_loc'] . '<br /><img src="' . $row['file_loc'] . '" />';
}

大きなテーブルでは、rand() による順序付けが特に遅くなる可能性があることに注意してください。MySQL の ORDER BY RAND() 関数を最適化するにはどうすればよいですか?を参照してください。 それを最適化する方法について

于 2012-12-18T18:45:05.087 に答える
0

最初にすべての画像を選択するのはやり過ぎです..

次のようなことができます:

 SELECT file_loc
 FROM random AS r1 JOIN
       (SELECT (RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 2

この記事を確認できます: http://jan.kneschke.de/projects/mysql/order-by-rand/

于 2012-12-18T18:50:22.477 に答える
0

x (呼び出し) ごとに実行されるスクリプトを使用して、表示する 2 つの画像をマークします。

于 2012-12-18T18:48:51.497 に答える
0

MySQL ではこれについてよくわかりませんが、MS SQL では次のようにします。

SELECT TOP 2 img_id, newid() FROM images ORDER BY newid()

MySQLで同様に機能する場合、次のようになります

SELECT img_id, uuid() FROM images ORDER BY uuid() LIMIT 2
于 2012-12-18T18:49:13.103 に答える
0
select * from table order by rand() limit 0,2

ここから取られたコード: http://chandreshrana.blogspot.in/2014/06/how-to-fetch-randomly-two-records-from.html

于 2016-08-25T12:48:04.323 に答える