【问题标题】:Php random row helpphp随机行帮助
【发布时间】:2011-03-02 02:37:11
【问题描述】:

我创建了一些将返回随机行的代码,(嗯,所有行都以随机顺序) 但我假设它非常低效,并且在大型数据库中会成为一个问题......

有人知道更好的方法吗?

这是我当前的代码:

$count3 = 1;
$count4 = 1;
//Civilian stuff...
$query = ("SELECT * FROM `*Table Name*` ORDER BY `Id` ASC");
$result = mysql_query($query);
while($row = mysql_fetch_array($result)) {
$count = $count + 1;
$civilianid = $row['Id'];
$arrayofids[$count] = $civilianid;
//echo $arrayofids[$count];
}

while($alldone != true) {
$randomnum = (rand()%$count) + 1;
//echo $randomnum . "<br>";
//echo $arrayofids[$randomnum] . "<br>";
$currentuserid = $arrayofids[$randomnum];
$count3 += 1;

while($count4 < $count3) {
$count4 += 1;
$currentarrayid = $listdone[$count4];
//echo "<b>" . $currentarrayid . ":" . $currentuserid . "</b> ";
if ($currentarrayid == $currentuserid){
$found = true;
//echo " '" .$found. "' ";
}
}

if ($found == true) {
//Reset array/variables...
$count4 = 1;
$found = false;
} else {
$listdone[$count3] = $currentuserid;
//echo "<u>" . $count3 .";". $listdone[$count3] . "</u> ";
$query = ("SELECT * FROM `*Tablesname*` WHERE Id = '$currentuserid'");
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$username = $row['Username'];
echo $username . "<br>";
$count4 = 1;
$amountdone += 1;
if ($amountdone == $count) { //$count
$alldone = true;
}
}
}

基本上它会循环直到它得到一个尚未被选择的 id(随机)。 - 所以最后一个用户名可能需要几个小时:P

这是“坏”代码吗? :P :(

【问题讨论】:

  • 如果您对为什么所有变量都从 1 开始,而不是像数组那样从 0 开始感到困惑,我不知道,我只是决定它们都应该:P
  • 忽略大部分 cmets,他们只是在我预览时帮助我发现问题......

标签: php mysql random loops


【解决方案1】:

您可以将其委托给 MySQL:

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

它将从您的表中返回一个随机行,我想这应该比您的 php 解决方案更有效。尽管如此,在大型数据库中它仍然会很慢。

您可能有兴趣查看以下 Stack Overflow 帖子以获得替代解决方案:

【讨论】:

  • 这是否“有效” - 或其他 - 在大型数据库中,运行速度会慢吗? 编辑:Nvm,你已经更新了
  • 效率不高,因为需要全表扫描。查看this postthis one
  • @Skillman 这比您使用的方法效率更高。
【解决方案2】:

您可以更改查询,以随机顺序为您提供所有结果...

$query = ("SELECT * FROM `*Table Name*` ORDER BY RAND()");

然后将它们全部显示在一个简单的循环中。

或者您可以将所有结果放入一个数组中,然后随机化数组中的顺序。您可以为此使用 php shuffle() 函数。 http://www.php.net/manual/en/function.shuffle.php

我认为第一个选项会给您最好的结果,但正确的解决方案是衡量性能并在“太慢”时尝试优化。

然而,从你的数组中随机选择一个元素,看看你是否已经这样做了,如果你已经这样做了再试一次是可怕的。除此以外,什么都做。

【讨论】:

  • Shuffle() 对我来说听起来不错,但是是的,我总是可以尝试两者。谢谢,
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2015-02-16
  • 2011-02-28
相关资源
最近更新 更多