【问题标题】:PHP select random id from databasePHP从数据库中选择随机ID
【发布时间】:2023-03-22 22:12:01
【问题描述】:

我想从这个查询中选择一个随机的userid,其中 level = 1(普通用户)和alive = Yes(用户还活着并且可以玩)

$getaid = $sql->query("SELECT userid FROM `users` WHERE `level`='1' AND `alive`='yes'");

我知道我可以使用

$totalusers = mysql_num_rows($getaid);
$randomuserid = rand(1,$totalusers);

选择一个随机用户 ID,但在该代码中,它有可能选择已死的用户(活着 = 否)或工作人员(级别 >= 1)。有没有更好的方法可以让我随机选择一个用户 ID,而没有机会抓住工作人员/死去的成员?

【问题讨论】:

    标签: php mysql sql select random


    【解决方案1】:

    你可以使用ORDER BY RAND() LIMIT 1:

    $getaid = $sql->query("SELECT userid FROM `users` WHERE `level`='1' AND `alive`='yes' ORDER BY RAND() LIMIT 1");
    

    【讨论】:

      【解决方案2】:

      您的方法是所有可能世界中最糟糕的——您将所有数据从数据库中返回到 PHP 中的一个数组,然后在那里选择一个随机值。但是,它应该可以工作,因为您只是带回了合适的用户。

      在数据库中执行此操作的一种非常简单的方法是:

      SELECT userid
      FROM `users`
      WHERE `level`='1' AND `alive` = 'yes'
      ORDER BY rand()
      LIMIT 1;
      

      但是,如果您有超过几百行(或几千行),这开始变得过于昂贵。肯定还有其他方法,但是把所有数据都带回来并不是一个好主意。

      一个简单的解决方法是获取大约 100 行,然后将它们随机化:

      SELECT userid
      FROM `users` CROSS JOIN
           (SELECT COUNT(*) as cnt FROM users  `level` = '1' AND `alive` = 'yes') x
      WHERE `level` = '1' AND `alive` = 'yes' AND
            rand() < 100 * 1 / x
      ORDER BY rand()
      LIMIT 1;
      

      为了性能,您需要一个关于 `users(level, alive) 的索引。

      【讨论】:

        【解决方案3】:

        与其选择所有记录并尝试在 PHP 端随机选择一条记录,不如让数据库为您完成繁重的工作:

        SELECT   userid
        FROM     `users`
        WHERE    `level` = '1' AND `alive` = 'yes'
        ORDER BY RAND()
        LIMIT    1
        

        【讨论】:

          【解决方案4】:

          你可以的

          "SELECT userid FROM `users` WHERE `level`='1' AND `alive`='yes' ORDER BY RAND() LIMIT 1"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-24
            • 1970-01-01
            • 2018-01-12
            • 2014-08-23
            相关资源
            最近更新 更多