gpt4 book ai didi

mysql - RAND() 基于特定标准

转载 作者:行者123 更新时间:2023-11-29 00:06:00 24 4
gpt4 key购买 nike

基本上,我正在尝试创建某种“算法”来从表中选择行。

想象一下,您有一个游泳池,里面装满了 650 人,您想要运行一台机器,它可以舀起并捕获其中的 40请注意这 40 人,他们的 2 个人在池中只能很少被捕获。

所以现在说这是代码条款:

SELECT
*
FROM
people
ORDER BY
RAND()
LIMIT
40

然后我想在这样的查询中添加某种“算法”,它在 mySQL 中执行类似的操作

$rand = rand(4,100);
if($rand == 26) {
//the option is now open to potentially scoop those rare people which have the ID of `15256` and `884`
}

最佳答案

我会说:使用 ORDER BY RAND() 通常是个坏主意,因为它会产生巨大的性能影响。这是众所周知的事实,因为 RAND() 将被动态计算,因此无法对这些值使用索引。

但是,从理论上讲,您可以定义一些边界并检查是否存在随机生成的值。这将引导您进行类似的操作:

SELECT
id,
name
FROM
(SELECT
pool.id AS id,
name,
IF(rare_ids.id IS NULL, 1, 1/@probability_divisor) AS probability,
RAND() AS random
FROM
pool
LEFT JOIN
(SELECT 3 AS id
UNION ALL
SELECT 7 AS id) AS rare_ids
ON
pool.id = rare_ids.id
CROSS JOIN
(SELECT @probability_divisor:=10) AS init
) AS struct
WHERE
random<probability
ORDER BY
random
LIMIT 3

(检查 fiddle here)

对此的解释 - 你正在定义一些概率除数,然后检查随机生成的值是否在区间内 [0 .. 1/divisor] - 当然,这取决于事实RAND() 正在从 [0 .. 1]

生成值

在示例中,37 被选为“稀有人物 id”,这些人将以正常概率的 1/10 出现在结果集中。此外,我选择了带有 LIMIT 的 3 行,您很可能会想要更改。

此外,LEFT JOIN 只是为 id 和其他使用的东西指定一个定义位置。可以用IN代替,比如:

SELECT
id,
name
FROM
(SELECT
id,
name,
IF(id IN (3, 7), 1/@probability_divisor, 1) AS probability,
RAND() AS random
FROM
pool
CROSS JOIN
(SELECT @probability_divisor:=10) AS init
) AS struct
WHERE
random<probability
ORDER BY
random
LIMIT 3

(与 fiddle )

请注意,对于大数据集,这将工作得非常慢,但对于正常数量的行,它仍然适用。

关于mysql - RAND() 基于特定标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27443343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com