gpt4 book ai didi

MySQL WHERE RAND() 行为

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:59 24 4
gpt4 key购买 nike

考虑下表foo:

 a   b   v
0 9 1
10 19 2
20 29 3
30 39 4
40 49 5
50 59 6
60 69 7
70 79 8
80 89 9
90 100 10

ab 是某个值v 的上下边界。示例:

x = 79 => v = 8  

这可以通过以下语句完成:

SELECT `v`
FROM `foo`
WHERE 79 BETWEEN `a` AND `b`

哪个 MySQL 正确返回:

v
8

对于作为输入提供的 0 到 100 之间的每个数字,MySQL 将正确返回一个,并且只返回 1 到 10 之间的一个数字。

问题

但是,如果用随机数生成器替换输入数字,则行为会有所不同:

SELECT `v`
FROM `foo`
WHERE ROUND(RAND()*100) BETWEEN `a` AND `b`

MySQL 可能会返回从空结果集到 3 个数字的任何内容,而不是只返回一个数字!

问题一
这是 RAND() 语句的预期行为吗?这种看似奇怪的行为的原因是什么?

问题二
考虑到预期目的,该陈述是否正确?什么是正确的?如何纠正这种行为?

最佳答案

具有单个查询的 ansi-sql 友好解决方案看起来像

SELECT x.rnd, `v`
FROM yourTable y
INNER JOIN (SELECT RAND()*100 rnd) x
WHERE x.rnd BETWEEN y.`a` AND y.`b`;

它只生成一次随机值,然后用于连接查询。

演示:http://rextester.com/YOIW49684

查询和基表是从Tim Biegeleisen 借用的。

关于MySQL WHERE RAND() 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47503471/

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