【问题标题】:Mysql inline query returns different result than query with session variableMysql 内联查询返回的结果与使用会话变量的查询不同
【发布时间】:2021-06-25 09:37:40
【问题描述】:

我有一个表“名字”

+----+-------+
| 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


    【解决方案1】:
    select name 
    from firstname 
    JOIN (SELECT CEIL((select count(*) from firstname) * rand()) id) id USING (id);
    

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

    【讨论】:

    • 感谢您的回答。但是请你解释一下为什么需要它?在我的内联查询中,我也计算过一次。为什么我需要单独的查询?您通过加入和附加选择完成了与我对会话变量所做的相同的操作。为什么我需要一个单独的查询。为什么我不能在一次选择中计算这个。谢谢
    • 在我的内联查询中,我也计算了一次。 不,每个单独的行都测试了 WHERE。并且为每个单独的测试(即每一行)计算表达式(并为此计算调用 RAND(),给出新值)。
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2017-05-18
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多