PHP从数据库中选择随机ID

时间:2015-10-04 12:53:15

标签: php mysql sql select random

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

4 个答案:

答案 0 :(得分:4)

你可以做到

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

答案 1 :(得分: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)的索引。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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