具有给定的表和数据:
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,那么我的下一个猜测将是一些位比较和十进制位表示的恶作剧,但我不知道。