mysql - 使用子查询和 rand() 进行随机采样会产生意想不到的结果

标签 mysql sql subquery correlated-subquery

编辑:如果有什么区别,我使用的是 mysql 5.7.19。

我有一个表 A,并尝试对平均 10% 的行进行随机抽样。我决定在子查询中使用 rand() ,然后过滤掉随机结果就可以解决问题,但它给出了意想不到的结果。当我在过滤后打印出随机生成的值时,我得到的随机值与我的主查询的“where”子句不匹配,因此我认为它正在外部选择中重新生成随机值。

我想我错过了一些与子查询和执行时有关的东西,但我真的不确定发生了什么。

谁能解释一下我可能做错了什么?我查看了这篇文章:In which sequence are queries and sub-queries executed by the SQL engine? ,并且我的子查询是相关的,因此我假设我的子查询首先被执行,然后主查询将其过滤掉。根据我的假设,我不明白为什么结果具有应该被过滤掉的值。

查询:

select 
  * 
from 
(
  select  
    *, 
    rand() as rand_value
  from    
    A
) a_rand 
where 
  rand_value < 0.1;

结果:

--------------------------------------
| id   | events | rand_value         |
--------------------------------------
| c    |      1 | 0.5512495763145849 | <- not what I expected
--------------------------------------

最佳答案

我无法使用 this SQL Fiddle 进行重现使用该链接并单击蓝色的 [运行 SQL] 按钮几次

CREATE TABLE Table1
    (`x` int)
;

INSERT INTO Table1
    (`x`)
VALUES
    (1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)
;

查询 1:

select 
  * 
from (
      select  
             *
           , rand() as rand_value
      from Table1
      ) a_rand 
where 
  rand_value < 0.1

[结果]:

| x |          rand_value |
|---|---------------------|
| 1 | 0.03006686086772649 |
| 1 | 0.09353976332912199 |
| 1 | 0.08519635823107917 |

关于mysql - 使用子查询和 rand() 进行随机采样会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46459564/

相关文章:

mysql - 删除具有公共(public)字段的两个不同表的两个结果

mysql - 非技术人员的 SQL 和 NoSQL 类比

Mysql 月份数字到月份名称的转换

mysql - 从两个表插入一个表的 SQL 语句(使用另一个没有连接条件的 id)

php - MySQL - 如何更改表中行的顺序

mysql - 优化mysql查询(使用或创建索引)

php - 基于登录状态的条件显示链接 PHP

mysql - 在子查询中使用第一个查询中的行?

Hibernate 子选择与批量获取

mysql - 分组依据并限制 mySql 中的输出