php从数据库中随机选择记录

php从数据库中随机选择记录,php,mysql,Php,Mysql,可能重复: 我有一张超过300000张记录的桌子。我需要从这个表中选择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;

可能重复:

我有一张超过300000张记录的桌子。我需要从这个表中选择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}';
}
更新: 此后

我有

    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 
谢谢大家。

试试这段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"); 

您选择使用此解决方案:

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值

除了
orderbyrand()
解决方案之外(当然,这在大型数据集上表现不好,因为它不能使用索引),我可以想出另一种方法来随机选择许多行。下面是一些伪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)"
//在InnoDB中,MAX(id)比COUNT(*)快
$maxid=查询“从QM\U产品中选择最大(id)”
//生成N个随机值的列表,确保它们是不同的
$id_list=array();
同时(计数($idlist)<10){
$rand\u id=mt\u rand(1$maxid);
$id_list[$rand_id]=1;
}
//在SQL查询中将id列表转换为逗号分隔的字符串
$id_list=内爆(“,”,数组_键($id_list));
$rows=查询“从id位于($id\U列表)中的QM\U产品中选择*”

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

使用
mysql\u fetch\u array()
我的问题是如何让它运行得更快。请查看侧边栏。关于同一问题的多个问题。我需要选择多个记录。我该怎么做?我有同样的记录。