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()
我的问题是如何让它运行得更快。请查看侧边栏。关于同一问题的多个问题。我需要选择多个记录。我该怎么做?我有同样的记录。