【问题标题】:php randomly select records from database [duplicate]php从数据库中随机选择记录[重复]
【发布时间】:2012-12-11 13:02:33
【问题描述】:

可能重复:
MySQL select 10 random rows from 600K rows fast

我有一个包含超过 300,000 条记录的表。我需要从这个表中选择 10 或 13 或 20 条记录。

我尝试了以下方法。

这需要很长时间才能选择

SELECT * FROM products ORDER BY RAND() LIMIT 0,12

这种方式相同,但我似乎无法选择超过 1 条记录

$temp = mysql_query('SELECT id FROM products limit 0,12');
if ( count( $temp ) > 0 ) {
    $j = 1;
    foreach( $temp as $index => $row ) {
        $p[$j++] = $row[id];
    }
    $my_p= $p[ rand( 1, --$j ) ];
    $pp = 'SELECT id FROM products WHERE id = {$my_p}';
}

更新: 关注这个MySQL select 10 random rows from 600K rows fast

我有

    SELECT * FROM QM_Products AS r1 
JOIN (SELECT (RAND() * (SELECT MAX(id) 
FROM QM_Products )) AS id) AS r2 WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 0, 10 

谢谢大家。

【问题讨论】:

  • 使用mysql_fetch_array()
  • 我的问题是如何让它运行得更快。
  • 查看侧边栏。关于同一问题的多个问题。
  • 我需要选择多于一条记录。我该怎么做

标签: php mysql


【解决方案1】:

您选择使用此解决方案:

SELECT * FROM QM_Products AS r1 
JOIN (SELECT (RAND() * (SELECT MAX(id) 
FROM QM_Products )) AS id) AS r2 WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 0, 10 

但是,我要指出的是,如果随机表达式返回接近表末尾的 id,则可能会得到少于 10 行。

此外,这不是一个随机选择,因为返回的行将始终具有相邻的 id 值。

除了ORDER BY RAND() 解决方案(当然这在大型数据集上表现不佳,因为它不能使用索引),我可以想到另一种随机选择行数的方法。下面是一些伪 PHP 代码:

// MAX(id) is quicker than COUNT(*) in InnoDB
$maxid = query "SELECT MAX(id) FROM QM_Products"

// generate a list of N random values, making sure they're distinct
$id_list = array();
while (count($idlist) < 10) {
  $rand_id = mt_rand(1,$maxid);
  $id_list[$rand_id] = 1;
}

// convert the id list to a comma-separated string in an SQL query
$id_list = implode(",", array_keys($id_list)); 
$rows = query "SELECT * FROM QM_Products WHERE id IN ($id_list)"

如果随机值在不存在具有匹配 id 的行的空白处出现,您可能会得到少于 N 行。但上述方法比ORDER BY RAND() 或一次针对 1 行发出 N 次查询要快得多。因此,您可以设计一个循环来根据需要重复搜索多次以找到 N 行。如果您有非常大的间隙,这将不是很好,因为它可能会在找到足够的行之前循环很长时间。

【讨论】:

    【解决方案2】:

    试试这个 php 代码

    $r = mysql_query("SELECT count(*) FROM user");  
    $d = mysql_fetch_row($r);  
    $rand = mt_rand(0,$d[0] - 1);  
    
    $r = mysql_query("SELECT username FROM user LIMIT $rand, 1"); 
    

    【讨论】:

    • 我得到了相同的记录。
    猜你喜欢
    • 2019-03-25
    • 2023-03-22
    • 2012-05-22
    • 2013-01-03
    • 2011-03-31
    • 1970-01-01
    • 2021-10-05
    • 2011-09-05
    相关资源
    最近更新 更多