我可以在SELECT查询中重用计算字段吗?

sdf*_*for 62 mysql sql mysql-error-1054

有没有办法在mysql语句中重用计算字段.我收到错误"unknown column total_sale":

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / total_sale as f1_percent
FROM sales s
Run Code Online (Sandbox Code Playgroud)

或者我必须重复计算,如果我添加了我需要的所有计算,这将产生一个非常长的SQL语句.

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (s.f1 + s.f2) as f1_percent
FROM sales s
Run Code Online (Sandbox Code Playgroud)

当然我可以在我的php程序中完成所有计算.

rze*_*erg 77

是的,您可以重用变量.这是你如何做到的:

SELECT 
    @total_sale := s.f1 + s.f2 as total_sale, 
    s.f1 / @total_sale as f1_percent
FROM sales s
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多相关信息:http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

[注意:此行为未定义.根据MySQL文档:]

作为一般规则,您不应该为用户变量赋值并在同一语句中读取值.您可能会得到您期望的结果,但这不能保证.

  • @OMGPonies(和其他人)这是不受支持的:"作为一般规则,你不应该为用户变量赋值并在同一语句中读取值.你可能得到你期望的结果,但这不能保证." 它可以运行,就像运行一样.但结果可能不正确. (13认同)
  • “还可以在SET以外的语句中为用户变量分配值。在这种情况下,赋值运算符必须为:=而不是=,因为在非SET语句中,后者被视为比较运算符=:” (2认同)
  • 当我尝试将其与组函数一起使用时(例如“ SUM”或“ COUNT”),我得到了违反直觉和无益的结果,即变量始终具有上一行的值,而不是我所在行的值。不支持有充分的理由,应避免使用。 (2认同)
  • 显然,此功能已被弃用,并将及时删除。 (2认同)

Rob*_*t D 48

以下似乎在我对MySQL 5.5的测试中运行良好:

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (SELECT total_sale) as f1_percent
FROM sales s
Run Code Online (Sandbox Code Playgroud)

  • 由于当前接受的答案不能每次都有效,这应该是公认的答案 (3认同)
  • 我喜欢这个.到目前为止,所有答案的最佳可读性,并没有关于在mysql文档中使用它的警告.但是,它不能用于引用组结果,例如您使用SUM或COUNT获得的结果. (2认同)
  • 注意,这可能仅适用于简单的算术运算,但不适用于“ SUM”或“ COUNT”:您将获得不支持“ reference'[colname]'(对组函数的引用)”。 (2认同)

OMG*_*ies 13

只有跨平台支持的方法是使用派生表/内联视图:

SELECT x.total_sale,
       x.f1 / x.total_sale as f1_percent
  FROM (SELECT s.f1,
               s.f1 + s.f2 as total_sale, 
          FROM sales s) x
Run Code Online (Sandbox Code Playgroud)


AJ.*_*AJ. 6

您可以使用子选择:

select tbl1.total_sale,
       tbl1.f1/tbl1.total_sale as f1_percent 
  from (select s.f1+s.f2 AS total_sale, 
               s.f1 
          from sales s) as tbl1;
Run Code Online (Sandbox Code Playgroud)


kiw*_*kiw 5

您可以使用子查询,如下所示:

SELECT 
    h.total_sale, 
    s.f1 / h.total_sale AS f1_percent
FROM sales s,
    (SELECT id, f1 + f2 AS total_sale FROM sales) h
WHERE
    s.id = h.id
Run Code Online (Sandbox Code Playgroud)

编辑:
固定笛卡尔积,假设主键是id.
这应该相当于优化后的OMG Ponies的解决方案,但我认为如果您需要更多子查询,它会变得更难阅读。