一尘不染

如何从数据库中回显随机行?

mysql

我有一个数据库表,其中包含约1.6亿行。

该表有两列: idlisting

我只需要使用PHP从listing列中显示1000个随机行并将它们放入<span>标记中。像这样:

<span>Row 1</span>
<span>Row 2</span>
<span>Row 3</span>

我一直在尝试这样做,ORDER BY RAND()但是要花这么长时间才能在如此大的数据库上加载,而且我找不到其他解决方案。

我希望有一个快速/轻松的方法来做到这一点。我无法想象仅回显1000个随机行是不可能的……谢谢!


阅读 242

收藏
2020-05-17

共1个答案

一尘不染

ORDER BY
RAND()是一个可以在小型数据库上正常运行的mysql函数,但是如果您运行的行大于10k,则应在程序内部构建函数,而不要使用mysql预制函数或以特殊方式组织数据。

我的建议:通过自动增量使mysql数据保持索引id,或添加其他增量和唯一行。

然后构建一个选择函数:

<?php
//get total number of rows
$result = mysql_query('SELECT `id` FROM `table_name`', $link); 
$num_rows = mysql_num_rows($result);

$randomlySelected = [];

for( $a = 0; $a < 1000; $a ++ ){

        $randomlySelected[$a] = rand(1,$num_rows);

}

//then select data by random ids
$where = "";

$control = 0;
foreach($randomlySelected as $key => $selectedID){

    if($control == 0){

        $where .= "`id` = '". $selectedID ."' ";

    } else {

        $where .= "OR `id` = '". $selectedID ."'";

    }
    $control ++;
}


$final_query = "SELECT * FROM `table_name` WHERE ". $where .";";
$final_results = mysql_query($final_query);

?>

如果缺少该1.6亿个数据库中的某些增量ID,那么如果一个随机选择的ID数组少于所需数量,则可以轻松地添加一个函数来添加另一个随机ID(可能是while循环)。

让我知道您是否需要其他帮助。

2020-05-17