首先查询,然后随机化,然后检索剩余的字段

时间:2016-07-16 16:21:23

标签: php mysql sql

我有一个包含大约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那样进行循环?

3 个答案:

答案 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()

执行一个查询会更快