gpt4 book ai didi

mysql - 使用 `rand()` 和 `having`

转载 作者:IT王子 更新时间:2023-10-28 23:52:12 27 4
gpt4 key购买 nike

我有一个包含记录列表的表。每次迭代,必须从特定的偏移量开始随机选择一组。每一行都有机会被选中(例如,新的或不经常被选中的行被选中的次数更多)。

但是,某些东西 不起作用,导致返回不满足使用别名 rand() 的条件的行。

我正在尝试使用以下查询:

select
id,
probability,
rand() rolledChance
from records
where id > :offset
having rolledChance < probability;

其中:offset是prepared statement参数,是该用户在上一次迭代中最后扫描的id。

在这样创建的表上(这是表的相关子集):

CREATE TABLE records (id INT, probability FLOAT);

其中概率是表 records 中介于 0 和 1 之间的值。但是,这会返回不满足条件的行。我用以下查询检查了这一点:

select
*,
x.rolledChance < x.probability shouldPick
from
(select
id,
probability,
rand() rolledChance
from records
having rolledChance < probability
) x;

返回的几行是:

id      probability     rolledChance            shouldPick
12 0.546358 0.015139976530466207 1
26 0.877424 0.9730734508233829 0
46 0.954425 0.35213605347288407 1

当我按如下方式重新调整第二个查询时,它按预期工作,并且只返回 rolledChance 实际上低于 probability 的行:

select
*,
x.rolledChance < x.probability shouldPick
from
(select id, probability, rand() rolledChance from records) x
where rolledChance < probability;

那我错过了什么? probabilityrolledChance 的使用方式是否与我在比较中想象的不同? rand() 是否每次在同一查询中使用别名时都进行评估?

版本输出:mysql Ver 15.1 Distrib 10.0.28-MariaDB,for debian-linux-gnu (x86_64) using readline 5.2,在 Debian Jessie 上运行。

最佳答案

我认为问题在于 HAVING 在 GROUP BY 之后应用,但仍在 SELECT 阶段之前。我意识到这很令人困惑,因为 HAVING 子句引用了 SELECT 语句中的一列,但我认为它基本上只是执行 SELECT 语句中的任何内容两次 - 一次是 having,然后是 SELECT。

例如,参见 this answer .

请注意,这尤其令人困惑,因为如果您在 HAVING 子句中引用未出现在 SELECT 语句中的列名,则会引发错误。

例如,this fiddle

但根据上面的 fiddle ,它仍然可以让您根据未出现在输出中的函数的结果进行实际过滤。长话短说,HAVING 子句仍在执行您想要的操作,但您不能同时使用该方法过滤随机值并同时显示它。如果你需要这样做,你需要先使用子查询固定值,然后外部查询可以在其上过滤和显示。

此外,为了清楚起见,可能值得在 having 子句中使用 RAND(),而不是 SQL 部分。虽然我知道这个问题是在问为什么这样做而不是试图具体解决问题。

关于mysql - 使用 `rand()` 和 `having`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44496024/

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