【问题标题】:PHP MySQL select random value from tablePHP MySQL从表中选择随机值
【发布时间】:2015-12-22 10:21:28
【问题描述】:

我正在尝试从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_query() 运行查询,你必须有mysql_fetch_row() 才能找到相应的城市,不是吗!!
  • 请避免使用mysql_query(),它在最新版本中已被弃用。使用mysqli_* 或 PDO。

标签: php mysql select random


【解决方案1】:

使用您给出的方法是资源密集型不是很随机并且缓慢且低效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

【讨论】:

    【解决方案2】:

    试试这个:

        <?php
    $result = $mysqli->query("SELECT COUNT(*) FROM mytable")
    while ($row=$result->fetch_row()) { $count = $row[0]; }
    $offset = rand(0,$count);
    $result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset");
    ...
    

    【讨论】:

      【解决方案3】:

      使用这样的东西:

      while($row = mysql_fetch_array($aResult))
                      {
                        echo '<tr class="select">';
                        echo '<td>'.$row['city'].'</td>';
                        echo '</tr>';
                      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多