我想在第一个和第二个半场比赛中计算足球比赛的所有进球数,但我只有前半场和最后得分的数据。
SELECT SUM( scorehome_ht + scoreguest_ht ) AS halftime,
(SUM( scorehome_end + scoreguest_end ) - halftime) AS end
FROM matches;
我是stackoverflow的新手,不熟悉MySQL,是的,我之前使用谷歌:)
答案 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;