用户定义变量存在时 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 非法混合排序规则