2014-05-05 57 views
2

我想在第一個和第二個半場進行足球比賽中的所有進球,但是我只有第一個半場和最後一個得分的數據。SQL別名不起作用

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

我是新的計算器,不熟悉MySQL的,是的,我用谷歌:)

+0

你會得到一些錯誤嗎? – Ejaz

+0

未知列'halftime'in'field list' – user3236231

回答

4

分配到一個山坳的別名umn不能被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的引用在賦值之前將得到前一個賦值的任何值(如從前一行)

4

之前,您不能在同一個SELECT查詢中使用別名,但你可以做的是包裝他們在派生表:

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; 
3

你可以不喜歡它

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