一起添加MySQL别名字段

Wri*_*eek 22 mysql sql

考虑类似于的查询:

 SELECT sum(EXPR) as total,
        sum(EXPR) as total2, 
        sum(total+total2) as grandtotal 
 FROM tablename
Run Code Online (Sandbox Code Playgroud)

这出现并在字段列表中显示未知列总数.

无论如何在计算中引用别名字段而不重新输入sum表达式,因为sum(EXPR)每一侧都很长.

ang*_*son 23

以下是数据库引擎中执行操作的顺序.

请注意,这是一个关于如何执行事物的语义视图,数据库可能以不同的顺序执行操作,但它必须产生结果,就像它以这种方式完成一样.

  1. 首先评估FROM-part,从哪里获取数据
  2. 然后评估WHERE部分,我们感兴趣的行
  3. 然后评估GROUP BY-part,我们如何组合生成的行
  4. 然后评估HAVING-part,我们感兴趣的是哪些组
  5. 然后评估ORDER BY-part,我们想要那些行/组的顺序
  6. 最后,评估SELECT部分​​,我们感兴趣的是哪些列

一些数据库引擎允许你绕过这一点,通过将"GROUP BY 2"命名为SELECT-part中第二列的分组,但如果你坚持上述顺序,你现在应该知道你的代码没有的原因工作是没有名称为total或total2(尚)的列.

换句话说,您需要重复这两个表达式,或者找到另一种方法.

你可以做的是使用一个子查询(假设你是支持这个的MySQL版本):

SELECT total, total2, total+total2 as grandtotal
FROM (
    SELECT sum(EXPR) as total, sum(EXPR) as total2
    FROM tablename
    ) x
Run Code Online (Sandbox Code Playgroud)

根据评论剔除其余部分.

我对MySQL知之甚少,所以您可能需要对子查询进行别名:

...

    FROM tablename
    ) AS x
      ^-+^
        |
        +-- add this
Run Code Online (Sandbox Code Playgroud)

某些数据库引擎也不允许在别名子查询时使用关键字AS,因此如果上述方法不起作用,请尝试以下操作:

...

    FROM tablename
    ) x
      ^
      |
      +-- add this
Run Code Online (Sandbox Code Playgroud)

  • +1极端彻底.是的,子查询需要别名. (2认同)

Fos*_*sco 6

SELECT total, total2, total + total2 as grandtotal from (
 SELECT sum(EXPR) as total, 
        sum(EXPR) as total2,  
 FROM tablename 
) x
Run Code Online (Sandbox Code Playgroud)