在MySQL数据库中选择两个随机行

时间:2012-12-18 18:42:25

标签: php mysql

我有一个装满图像的数据库,我想吐出并显示两个随机图像。这段代码做得很好,但我不相信它是最好的方法,特别是如果数据库最终会有很多行。我已经研究过使用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'] . '" />';
}

任何提高查询效率的建议?

5 个答案:

答案 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