编辑:如果它有任何区别,我使用的是mysql 5.7.19。
我有一张表A,我试图平均随机抽样10%的行。我已经决定在子查询中使用rand(),然后过滤掉随机结果就可以了,但它会产生意想不到的结果。当我在过滤后打印出随机生成的值时,我得到的随机值与我的主查询的“where”子句不匹配,所以我想它是在外部select中重新生成随机值。
我想我错过了一些与子查询有关的事情,当事情被执行时,但我真的不确定发生了什么。
任何人都可以解释我可能做错了吗?我查看了这篇文章: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
--------------------------------------
答案 0 :(得分:0)
我无法使用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 |