PHP从数据库中选择随机id


PHP select random id from database

我想从这个查询中选择一个随机的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,但在该代码中有一个机会,它选择一个用户是死的(活着= No)或工作人员(级别>= 1)。有没有更好的方法,我可以选择一个随机的用户id没有机会抓住工作人员/死亡的成员?

你可以做

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

让数据库为您完成繁重的工作,而不是选择所有记录并尝试在PHP方面随机选择一个:

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

您的方法是所有可能的世界中最糟糕的——您将所有数据从数据库返回到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)的索引

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

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