MySQL:在同一SELECT语句中重新使用用户定义的变量

MySQL:在同一SELECT语句中重新使用用户定义的变量,mysql,variables,select,user-defined,Mysql,Variables,Select,User Defined,我在stackoverflow中进行了搜索,但没有找到我的问题的确切答案,所以如果可以,请帮助我 我“想要”构建如下SQL语句: SELECT @tax1 := (complicated calculation formula), @owe := (another complicated calculation formula), IF(@owe=0, 0,@tax1/@owe) FROM ... 然而,在MySQL的文档中,它建议不要说: 作为一般规则,决不应将值分配给用户变量,

我在stackoverflow中进行了搜索,但没有找到我的问题的确切答案,所以如果可以,请帮助我

我“想要”构建如下SQL语句:

SELECT
  @tax1 := (complicated calculation formula),
  @owe := (another complicated calculation formula),
  IF(@owe=0, 0,@tax1/@owe)
FROM ...
然而,在MySQL的文档中,它建议不要说:

作为一般规则,决不应将值分配给用户变量,并在同一语句中读取该值。你可能会得到你期望的结果,但这不是保证。涉及用户变量的表达式的计算顺序未定义,可能会根据给定语句中包含的元素而改变;此外,不能保证MySQL服务器的不同版本之间的顺序相同。在选择@a,@a:=@a+1,…,您可能会认为MySQL将首先计算@a,然后再进行赋值。但是,更改语句(例如,通过添加GROUPBY、HAVING或ORDERBY子句)可能会导致MySQL选择具有不同求值顺序的执行计划

我的目标是避免复制和粘贴那些非常复杂的公式,因为这会妨碍可读性,如果公式每次都发生变化,我需要确保它在所有地方都发生了变化——但我知道这样做,它会工作得很好

此外,我知道别名不起作用,因为别名只在GROUP BY、HAVING和ORDER子句中起作用

我在其他一些帖子中读到,先做一个子查询来计算@tax1和@owe,然后使用另一个查询来组合结果。但我认为,与简单地复制和粘贴这些公式相比,性能可能效率更低

有人对他们会做什么有什么建议吗?还是我一直在选择可读性和性能


提前感谢。

我经常在select语句中使用变量进行顺序评估、聚合、组统计和数据分类

这是一个例子:

MySQL列出每个类别的前X条记录,将每条记录与其以前的差异结合起来


我希望这能给您一个提示

是的,在没有用户变量的SQL中实现这一点的唯一方法是编写派生表子查询。然后,可以使用列别名引用这些复杂表达式的结果:

SELECT tax1, owe, IF(owe=0, 0,tax1/owe) AS ratio
FROM (
  SELECT
    (complicated calculation formula) AS tax1,
    (another complicated calculation formula) AS owe
  FROM ...
) AS _sub
MySQL在优化子查询方面存在一些问题,但派生表的情况并不坏

关于MySQL和子查询的警告是关于在WHERE子句的范围条件中使用子查询。MySQL无法判断子查询是否为常量,它会将子查询作为依赖子查询重复计算,即使这不是必需的

SELECT tax1, owe, IF(owe=0, 0,tax1/owe) AS ratio
FROM (
  SELECT
    (complicated calculation formula) AS tax1,
    (another complicated calculation formula) AS owe
  FROM ...
) AS _sub