使用您给出的方法是资源密集型,不是很随机并且缓慢且低效。 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
其中 id = '$id' LIMIT 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_ 中没有未来(并且很少存在)。 Updating from MYSQL to MYSQLI