【问题标题】:Adding MySQL alias fields together一起添加 MySQL 别名字段
【发布时间】:2010-07-30 16:50:17
【问题描述】:

考虑类似以下的查询:

 SELECT sum(EXPR) as total,
        sum(EXPR) as total2, 
        sum(total+total2) as grandtotal 
 FROM tablename

这出现并表示字段列表中的未知列总数。

有没有办法在计算中引用别名字段而不重新输入总和表达式,因为每一边的sum(EXPR) 都很长。

【问题讨论】:

  • 我有机会检查我的答案,发现我错了。因此,我将其删除。感谢您指出我的错误。

标签: sql mysql


【解决方案1】:

这是在数据库引擎中执行事物的顺序。

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

  1. 首先评估 FROM 部分,我从哪里获取数据
  2. 然后评估 WHERE 部分,我们对哪些行感兴趣
  3. 然后评估 GROUP BY 部分,我们如何组合结果行
  4. 然后评估 HAVING 部分,我们对哪些组感兴趣
  5. 然后评估 ORDER BY 部分,我们想要这些行/组的哪个顺序
  6. 最后,SELECT 部分被评估,我们对哪些列感兴趣

一些数据库引擎允许你规避这一点,通过在 SELECT 部分中按“GROUP BY 2”按第二列分组,但如果你坚持上述顺序,你现在应该知道原因您的代码不起作用是没有名称为 total 或 total2 的列(尚未)。

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

您可以做的是使用子查询(前提是您使用的是支持此功能的 MySQL 版本):

SELECT total, total2, total+total2 as grandtotal
FROM (
    SELECT sum(EXPR) as total, sum(EXPR) as total2
    FROM tablename
    ) x

根据评论删除其余部分。

虽然我对 MySQL 了解不多,所以您可能必须为子查询起别名:

...

    FROM tablename
    ) AS x
      ^-+^
        |
        +-- add this

一些数据库引擎在给子查询起别名时也不允许使用关键字 AS,所以如果上面的方法不起作用,试试这个:

...

    FROM tablename
    ) x
      ^
      |
      +-- add this

【讨论】:

  • +1 表示非常彻底。是的,子查询需要别名。
【解决方案2】:
SELECT total, total2, total + total2 as grandtotal from (
 SELECT sum(EXPR) as total, 
        sum(EXPR) as total2,  
 FROM tablename 
) x

【讨论】:

    【解决方案3】:
    SELECT
    WITH Sums AS
    (
     SELECT sum(EXPR) as total, 
            sum(EXPR) as total2
     FROM tablename 
    )
    SELECT SUM(sums);
    

    为您的 tsql 粉丝...

    【讨论】:

    • MySQL 不支持 WITH 子句:stackoverflow.com/questions/1382573/…
    • @Lasse V. Karlsen:WITH 子句不是专门的 TSQL - Oracle 从 9i 开始支持非递归 WITH。
    • 我不关心 WITH,答案是“为你的 tsql 粉丝”。
    • 我无法正确理解会引发这样一个问题的想法混乱。
    【解决方案4】:

    【讨论】:

    • 不,你不能。请参阅我对@kunal 回答的评论。
    猜你喜欢
    • 2011-01-05
    • 2017-11-14
    • 2012-03-04
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多