5

我有一个充满图像的数据库,我想吐出并显示两个随机图像。这段代码正确地完成了它,但我不相信这是最好的方法,特别是如果数据库最终会有很多行。我已经研究过使用 MySQL 的 rand() 函数并将其限制为两个结果,但是从我所读到的 rand() 在大型数据库上相对较慢。另一个问题是双重数据库查询。有没有更好的方法来通过 img_id 选择两个随机行?

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

使用每 x (您的调用)执行的脚本来标记要显示的两张图片。

于 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 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
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 回答