SQL别名不起作用

时间:2014-05-05 18:11:34

标签: mysql sql

我想在第一个和第二个半场比赛中计算足球比赛的所有进球数,但我只有前半场和最后得分的数据。

SELECT SUM( scorehome_ht + scoreguest_ht ) AS halftime, 
    (SUM( scorehome_end + scoreguest_end ) - halftime) AS end 
FROM matches;

我是stackoverflow的新手,不熟悉MySQL,是的,我之前使用谷歌:)

3 个答案:

答案 0 :(得分:4)

您不能在同一个选择查询中使用别名,但您可以做的是将它们包装在派生表中:

SELECT halftime, scorehome_end + scoreguest_end - halftime AS end 
FROM
(
    SELECT scorehome_end, 
           scoreguest_end, 
           SUM( scorehome_ht + scoreguest_ht ) AS halftime
    FROM matches
) x;

答案 1 :(得分:4)

分配给列的别名不能被SELECT列表中的另一个表达式引用。

一种解决方法是重复表达,并且在性能方面通常是最有效的,例如

SELECT SUM( scorehome_ht + scoreguest_ht ) AS halftime, 
    SUM( scorehome_end + scoreguest_end ) - SUM( scorehome_ht + scoreguest_ht ) AS end 
FROM matches;

我说这是一种解决方法,因为还有其他一些可用的解决方法。它也可以使用内联视图,因为查询可以通过分配给每列的名称从内联视图引用列。这种方法要求MySQL运行内联视图查询,并将其实现为临时MyISAM表,然后外部查询针对MyISAM表运行,因此这种方法效率较低。

另一种选择是利用MySQL用户变量来保存表达式的结果:

SELECT @halftime := SUM( scorehome_ht + scoreguest_ht ) AS halftime, 
    SUM( scorehome_end + scoreguest_end ) - @halftime AS end 
FROM matches;

但这种行为取决于无证件的行为; MySQL按照列出的顺序处理SELECT列表中的表达式,因此分配给@halftime的值在赋值后的表达式中可用。 (在分配之前对@halftime的引用将获得先前赋值中的任何值(如前一行)。

答案 2 :(得分:3)

你可以这样做

SELECT SUM( scorehome_ht + scoreguest_ht ) AS halftime, 
    SUM(scorehome_end + scoreguest_end) - SUM(scorehome_ht + scoreguest_ht) AS end 
FROM matches;