首页 > 解决方案 > Mysql 内联查询返回的结果与使用会话变量的查询不同

问题描述

我有一个表“名字”

+----+-------+
| id |  name |
+----+-------+
| 1  |  Sam  |
| 2  |  Tom  |
| 3  | David | 
| 4  |  Bob  | 
+----+-------+

现在我只想强制 MySql 在每次查询时给我一个随机名称。所以要做到这一点,我执行:

select name 
from firstname 
where id = CEIL((select count(*) from firstname) * rand());

并且此查询不时返回零到三个结果。但是,如果我设置一个包含先前计算的 id 的会话变量,那么它可以正常工作

set @x = CEIL((select count(*) from firstname) * rand());

select name 
from firstname 
where id = @x;

为什么会这样?如何在没有会话变量的情况下进行内联查询?

在“5.6.25”和“5.6.51”上测试

标签: mysql

解决方案


select name 
from firstname 
JOIN (SELECT CEIL((select count(*) from firstname) * rand()) id) id USING (id);

您必须计算id一次所需的随机数并将其应用于所有行,而在您的查询中计算并应用于具有不同结果的每个单独的行。


推荐阅读