mysql - 带有 id 的 MYSQL SELECT 与 FLOOR RAND 比较返回一、多于一且无行
问题描述
使用给定的表格和数据:
CREATE TABLE `people` (
`id` integer auto_increment,
`name` varchar(20),
PRIMARY KEY(`id`)
);
INSERT INTO `people` (`name`) VALUES ('John'), ('Emma'), ('George'), ('Barry'), ('Lisa'), ('Bob'), ('Olivia');
一个问题:
SET @all = (SELECT COUNT(id) FROM `people`);
SELECT * FROM `people` WHERE `id` = FLOOR(1 + RAND() * @all);
结果是:
id name
2 Emma
5 Lisa
或者
id name
3 George
4 Barry
或者
id name
5 Lisa
或者
id name
1 John
6 Bob
有时结果有 3 行
id name
3 George
4 Barry
7 Olivia
一旦我得到 4 行的结果
id name
4 Barry
5 Lisa
6 Bob
7 Olivia
或空结果
当我检查表达式生成的值时FLOOR(1 + RAND() * @all)
,它似乎是整数值,例如。5
,而不是小数。
但是当我先将值存储到一个变量中,然后在查询中使用该变量时,结果如预期的那样,总是一行:
SET @r = FLOOR(1 + RAND() * @all);
SELECT * FROM `people` WHERE `id` = @r;
我猜当我将 FLOOR 的结果存储到一个变量中时,它会被转换,但是 mysql 如何比较一个结果等于许多不同的值,我的第一个猜测是它以某种方式四舍五入,但是当我得到的值delta > 4 那么我的下一个猜测是一些位比较和十进制位表示恶作剧,但我不知道。
解决方案
推荐阅读
- atom-editor - 如何将 Brainfuck 添加到 Atom 中
- telegram - 如何以最快的方式发送音频 Telegram Bot
- javascript - 页面加载时使浏览器窗口全屏
- flutter - Flutter 中的日期时间
- recaptcha - reCAPTCHA 密钥的上限是多少?
- javascript - 不能使用 `Authorization: Token xxx` 标头作为请求数据的标识
- correlation - 重新编码 p 值
- python - 如何在不同类的实例之间传递相同的变量(可迭代)(从同一个父类继承)
- javascript - 如何从 React Js 中的 API 响应中获取 HTML 标签?
- php - Laravel Mail Smtp php_network_getaddresses: getaddrinfo failed: Name or service not known