gpt4 book ai didi

PHP MySQL 从表中选择随机值

转载 作者:行者123 更新时间:2023-11-28 23:50:12 26 4
gpt4 key购买 nike

我试图从 location 表中获取一个随机城市,但没有成功,我搜索了 Stack 并尝试了很多方法仍然无法正常工作。

<?php  include "../database.php"?>
<?php

$sSQLQuery = mysql_query("SELECT city FROM location ORDER BY RAND() LIMIT 1;");

$aResult = mysql_query($sSQLQuery);

?>

<span class="h3"><?php echo $aResult ?></span>

最佳答案

使用您提供的方法是资源密集型不是很随意并且缓慢且低效MySQL RAND() 尤其是 ORDER BY RAND() 效率特别低。

ORDER BY随机值,需要调用整个表然后洗牌,就像洗牌中的每张牌以选出第一张从顶部开始的卡片,剩下 51 张卡片被调用、加载和洗牌,没有输出。

关于破坏基本 SQL 代码以获得稍好结果的主题有各种讨论,例如:https://stackoverflow.com/a/17757787/3536236

可以在这里阅读更多内容:http://theoryapp.com/select-random-records-in-mysql/

那么,可以做什么呢?

好吧,如果您的 location 表有一个 Id 列(当然是索引的),您真的、真的应该这样做,那么这会让生活变得更轻松。

如果您在 Id 列中没有 NO GAPS,那么您可以简单地找到最大值并从 1 到最大值中选择一个随机数,

所以

$maxSql = mysqli_query($connection, "SELECT id FROM location ORDER BY id DESC LIMIT 1"); 
$max = mysqli_fetch_array($maxSql);
$max = $max['id'];

这按索引的数字 ID 列对表进行排序并取最高值,这将是最高的,然后将其插入 PHP 随机生成器以提供:

$id = mt_rand(1,$max);

然后

$sSQLQuery = mysqli_query($connection, "SELECT city FROM location 

WHERE id = '$id' 限制 1;"); $city = mysqli_fetch_array($sSQLQuery);

如果您确实有间隙,那么在循环中运行第一部分以检查该值是否存在,如果存在则返回该行会更容易,例如:

unset($found);
while(!$found){
$sSQLQuery = mysqli_query($connection, "SELECT city FROM location WHERE id = '$id' LIMIT 1;");
if (mysqli_num_rows($sSQLQuery)){
$found = true;
$city = mysqli_fetch_array($sSQLQuery);
}
$id = mt_rand(1,$max);
}
unset($found);

(还有很多事情可以做,这里的代码并不完美——远非完美——但我想表达的概念是,对于任何有意义的大小的数据库表,它都会更好、更高效“随机”因素由 PHP 而不是 MySQL 内部提供。PHP 提供了比 MySQL 更多的随机范围和更容易的随机生成,并且对于超过 1000 行的表,RAND() 真的,真的应该是避免了,我发现它会增加 ~0.25-0.4 秒的页面加载时间,从 ~500 个表中以“随机”方式排序一组 100 个结果。)

还研究和使用 MySQLi(或 PDO)作为一个重要的问题,如果 MySQL_ 没有 future (并且很少出现)。 Updating from MYSQL to MYSQLI

关于PHP MySQL 从表中选择随机值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32767702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com