用户定义变量存在时 MySQL 中“order by”子句的执行顺序

Posted

技术标签:

【中文标题】用户定义变量存在时 MySQL 中“order by”子句的执行顺序【英文标题】:The execution order for the 'order by' clause in MySQL when user-defined variables exist 【发布时间】:2017-04-27 03:36:31 【问题描述】:

当我试图通过 Leetcode(https://leetcode.com/problems/rank-scores/#/description) 中的一个问题时,我遇到了一个问题。

这个问题的一个解决方案如下所示:

SELECT
  Score,
  @rank := @rank + (@prev <> (@prev := Score)) Rank
FROM
  Scores,
  (SELECT @rank := 0, @prev := -1) init
ORDER BY Score desc

我曾经读过一篇文章,说 ORDER BY 子句总是最后运行,显然在 SELECT 子句之后。虽然我在这个代码块中发现它没有。当 order by 子句被删除或更改时,结果会更改(而不是订单)。我想可能是因为这里有一些用户定义的变量?

【问题讨论】:

Execution order of expressions in SELECT statement的可能重复 子句的顺序或多或少是正确的(尽管 LIMIT 在 ORDER BY 之后)。但是没有定义变量的评估顺序。 通过推理,你已经知道了这个问题的答案 【参考方案1】:

根据手册here,在 SELECT 语句中,每个 select 表达式仅在发送到客户端时才进行评估。 select 子句和 order 中的 Score 列子句是肯定的,但是分数列后面的用户定义变量会在mysql服务器发送给客户端时被计算。

【讨论】:

以上是关于用户定义变量存在时 MySQL 中“order by”子句的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

在 LOCATE 中使用用户定义的变量时,MySQL 非法混合排序规则

mysql用户自定义变量

是否可以在 .NET MySqlCommand 中使用 MySql 用户定义变量?

mysql -- 动态获取结果集(重点)

MySQL视图存储过程触发器

MySQL# 自定义变量一行数据与多行的转换IF函数