我有一个装满图像的数据库,我想吐出并显示两个随机图像。这段代码做得很好,但我不相信它是最好的方法,特别是如果数据库最终会有很多行。我已经研究过使用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'] . '" />';
}
任何提高查询效率的建议?
答案 0 :(得分:5)
你可以使用
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()的顺序在大型表上可能特别慢。见How can i optimize MySQL's ORDER BY RAND() function? 如何优化它
答案 1 :(得分:0)
使用每x(您的通话)执行的脚本来标记要显示的两张图片。
答案 2 :(得分: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
答案 3 :(得分: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/
答案 4 :(得分:0)
select * from table order by rand() limit 0,2
从此处获取的代码:http://chandreshrana.blogspot.in/2014/06/how-to-fetch-randomly-two-records-from.html