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

标签 mysql mariadb

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

但是,某些东西 不起作用,导致返回不满足使用别名 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/

相关文章:

PHP/MYSQL 按月和年列出行

sql - Json数组列拆分成行SQL

java - 无法使用 MySQL 作为驱动程序在 MariaDB 中执行查询

mysql - 在 MariaDB 中使用 GROUP BY 子句 WITH ROLLUP 的两个类似查询的工作差异

mysql - centos 7安装mysql失败

PHP SQL ON DUPLICATE KEY 没有影响

php - 仅限生产的错误 : em dashes not appearing correctly

c# - 在 C# 中使用主键向数据库插入行的最佳方法是什么

mysql - 'use index for order by'在mysql中如何工作

mysql - UTF-8字符有问题;我看到的不是我存储的