1

昨天我有一个关于通过 rand() 订购 mysql 查询的问题。我在这里得到了一个很好的答案: https ://stackoverflow.com/a/16597706/2333744

答案的代码如下。

create temporary table results as
(Select *, @rn := @rn + 1 as rn, rand() as therand
from table1 inner join
  table2
  on table1.in = table2.in cross join
    (select @rn := 0) const
where table1.T = A
);

select *
from results
where therand < 1000/@rn
order by therand
limit 500;

我什么都懂,除了

cross join (select @rn : = 0) const

我不确定这是在做什么以及它是否重要。当我删除它时,我没有得到任何性能变化。任何人都可以理解这部分吗?

4

2 回答 2

1

在这种情况下,用户定义的变量 @rn仅用于制作序列号列,如上一个问题的答案中所解释的那样。

这里const不用作关键字......所以不要被' const-fused '。它只是一个给定的名称(select @rn := 0)......它可能是任何其他名称,如A, B, oops, aah, etc... (见下面的第二个链接)

请参阅以下链接中的示例使用以更好地理解用户定义的变量

  • 在 MySQL 中创建累积和列
  • MySql:选择查询 - 制作累积和列
  • 于 2013-05-17T17:17:17.950 回答
    0

    坦率地说,这一切都是为了重置@rn 变量。Is 被“打包”到一个选择中以避免运行 2 个查询。const 表示它是常量,因此只计算一次。

    当您删除它并将进一步的查询添加到单个事务中时,您可能会遇到麻烦。

    此致

    佐尔特

    于 2013-05-17T17:09:49.743 回答