我想从这个查询中选择一个随机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而没有机会抓住工作人员/死去的成员?
答案 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");