Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从表中随机获取多行_Php_Mysql_Random - Fatal编程技术网

Php 从表中随机获取多行

Php 从表中随机获取多行,php,mysql,random,Php,Mysql,Random,现在我使用ORDER BY Rand从表中随机选择3行;正如网络上所指出的,这种方法非常缓慢。我在一个只有30行的数据库上使用它,返回值需要很长时间。我发现的大多数其他解决方案只返回一行。返回多个随机行的最佳方法是什么 $get_projects_query = mysql_query( "SELECT p_id FROM project_data WHERE p_featured='1' ORDER BY Rand() LIMIT 3" ) or die(mysql_erro

现在我使用ORDER BY Rand从表中随机选择3行;正如网络上所指出的,这种方法非常缓慢。我在一个只有30行的数据库上使用它,返回值需要很长时间。我发现的大多数其他解决方案只返回一行。返回多个随机行的最佳方法是什么

$get_projects_query = 
  mysql_query(
    "SELECT p_id FROM project_data WHERE p_featured='1' ORDER BY Rand() LIMIT 3"
  ) or die(mysql_error());

while($project_row = mysql_fetch_array($get_projects_query)) {?>
  //Do stuff
} 
//end three random featured projects loop)

如果您只有30行,为什么不将所有30行下载到客户端,然后生成3个随机行索引呢。按索引列排序可能是主键。然后选择“限制1,偏移量=一个从0到表计数范围内的随机整数”。

如果只有30行,您还有几个其他选项

选择1

全部取30行。 呼叫洗牌 从这堆书中读出前三个 选择2

生成3个从0到29的随机数。叫他们r1,r2,r3。 选择其中,r1、r2、r3中的p_id 选择3

从…中选择p_id。。。 而$row=mysql\u fetch\u assoc$result$idList[]=$row[p\u id]; 洗牌$idList 选择其中,$idList[0]、$idList[1]、$idList[2]中的p_id
正如大家所说。您的查询中只有30个项目,如下所示:

不使用兰德进行查询 构建包含所有项的数组/对象-例如:items[] 在1和数组长度之间生成3个随机数x1、x2、x3,然后显示它们:项[1]、项[2]、项[3]
或者您的查询目前只有30个结果,但随着时间的推移,结果会越来越大?

选项2必须假设行主键是连续的,没有间隔。对于如此少的行数,选项1似乎非常合理,甚至可以将结果存储在memcache或类似文件中。但是如果只有30行,你会希望ID是单调递增的。对不起,我对这一点很陌生,使用选项3,我假设$idList是一个php数组?是的。创建未显示的数组,用表步骤2中的ID号填充,然后使用它生成第二个查询。@BandonRandon-您应该验证哪个部分/方法比较慢。order by rand在只有30行的表上不会变慢。你确定是查询占用了那么长的时间吗?@ajreal,我想知道是我的服务器变慢了,还是我正在加载图像。哼…@BandonRandon-是的,图像。。多少字节?再-think@ajreal,不是那么大。你认为rand会比将所有数据拉入php数组并使用“shuffle”更快吗?现在我只有5个查询。这是我的投资组合,所以我认为它不会超过30个,这将是很多项目要看。我想最多30个。这个方法不会只返回一个结果吗?