使用MySQL从数字池中选取单个随机数而非整行的SQL实现
问题根因
当前查询是对numberlist的整行记录做随机排序、取整行返回,没有将num1到num5五个字段的所有值拼接成扁平的数字集合,因此输出必然是包含5个数字的整行结果,无法得到单个随机数。
具体实现
通过纵向合并5个数字列生成全量数字池,再对池内的单值做随机抽取,兼容所有MySQL版本的写法如下:
SELECT single_num FROM ( SELECT num1 AS single_num FROM Project.numberlist UNION ALL SELECT num2 AS single_num FROM Project.numberlist UNION ALL SELECT num3 AS single_num FROM Project.numberlist UNION ALL SELECT num4 AS single_num FROM Project.numberlist UNION ALL SELECT num5 AS single_num FROM Project.numberlist ) AS number_pool ORDER BY RAND() LIMIT 1;
关键说明
- 不要替换为*
UNION:UNION*会自动剔除合并结果里的重复值,比如多名用户同时选了数字15,合并后只会保留1条15的记录,会扭曲数字池的实际分布,改变随机抽取的概率 - 执行后的返回结果为单个数值,和需求中提到的“从整行
(12, 15, 23, 54, 7)中随机拿出一个单值(比如23、15)”的效果完全一致
内容的提问来源于stack exchange,提问作者kielp2
相关产品推荐
相关产品推荐

