我有一个包含大约70列和120,000行数据的表。我想要做的是随机化一条记录,然后显示该记录的其他列的值。 如果我确实获取所有数据,
$result=mysqli_query($link, 'SELECT id, column1, column2, column3, ..., column 70 from table');
while ($row=mysqli_fetch_array($result))
{
$info[] = array('id'=>$row['id'], 'column1'=>$row['column1'], ...);
}
$randindex = rand(0,count($info));
$id = $info[$randindex]['id'];
echo $info[$randindex]['column1']; echo $info[$randindex]['column2']; ....
我担心这会显着减慢这个过程。所以我想在随机化之前只查询ID,然后使用随机ID来检索数据库中该记录的其他值。
$result=mysqli_query($link, 'SELECT id from table');
while ($row=mysqli_fetch_array($result))
{
$info[] = $row['id'];
}
$randindex = rand(0,count($info));
$id = $info[$randindex];
然后以某种方式检索此特定记录的所有其他字段。我问过如何在SQL here中执行此操作,但我想知道除了SQL之外是否还有其他更有效的方法。我是否需要像this那样进行循环?
答案 0 :(得分:1)
在您的代码中,执行以下操作:
select min(id) as minid, max(id) as maxid
from table;
然后使用php生成随机id
并执行:
select t.*
from table t
where t.id >= $randid
order by id
limit 1;
对于id
的索引 - 以及对值中没有太大差距的合理假设 - 那么这将很有效。
你可以只用一个查询做同样的事情:
select t.*
from table t cross join
(select min(id) as minid, max(id) as maxid from table) tt
where t.id >= minid + rand() * (tt.maxid - tt.minid)
order by id
limit 1;
答案 1 :(得分:0)
您可以直接在SQL查询中使用ORDER BY RAND()
:
SELECT * FROM table ORDER BY RAND() LIMIT 1
ORDER BY RAND()
实际上会对您的行进行随机排序,然后您只需执行LIMIT 1
以获得一行,即第一行。
答案 2 :(得分:0)
我不认为这是有效的。我认为用ORDER BY RAND()
执行一个查询会更快