2012-12-10 47 views
2

我想操縱子查詢生成的兩個虛擬字段到一個新的字段,但MySQL告訴我,「GP」是一個未知的列,但它已被聲明。請看看我的查詢:MySQL不識別虛擬列/字段

SELECT *, 

(SELECT COUNT(id_gol) FROM tb_gol as gol 
INNER JOIN tb_jogo as jg ON(gol.fk_id_jogo = jg.id_jogo) 
WHERE gol.ic_excluido != '*' AND gol.fk_id_equipe = e.id_equipe AND jg.fk_id_campeonato = g.fk_id_campeonato) as 'GP', 

(SELECT COUNT(id_gol) FROM tb_gol as gol 
INNER JOIN tb_jogo as jg ON(gol.fk_id_jogo = jg.id_jogo) 
WHERE gol.ic_excluido != '*' AND gol.fk_id_equipe != e.id_equipe AND (jg.fk_id_equipe1 = e.id_equipe OR jg.fk_id_equipe2 = e.id_equipe) AND jg.fk_id_campeonato = g.fk_id_campeonato) as 'GC', 

(SELECT COUNT(id_wo) as WOs FROM tb_wo as w INNER JOIN tb_jogo as j ON (w.fk_id_jogo = j.id_jogo) WHERE w.fk_id_equipe = e.id_equipe AND j.fk_id_campeonato = g.fk_id_campeonato) as 'WO', 

(GP+(GC*-1)) as 'SALDO' 

FROM tb_equipe as e 
INNER JOIN tb_gruposEquipes as ge ON (e.id_equipe = ge.fk_id_equipe) 
INNER JOIN tb_grupos as g ON (g.id_grupo = ge.fk_id_grupo) 
WHERE g.fk_id_campeonato = 23 
ORDER BY WO ASC 

正如你所看到的,「SALDO」將是「GP-GC」的結果。但MySQL不識別這些列

我該如何解決這個問題?

SOLUTION

非常感謝您的幫助,球員,但我想通了這個問題。 不能通過減少GP的GC來創建「SALDO」,因爲「GP」和「GC」在運行時不存在。

因此,當您需要在運行時操作虛擬字段時,必須重複生成虛擬字段的代碼。

然後,如果你有這樣的選擇:

SELECT *, (field1+1) as 'GP', (field2+1) as 'GC', (GP+GC) as 'SALDO' FROM (...) 

您需要使用它來取代它:

SELECT *, (field1+1) as 'GP', (field2+1) as 'GC', ((field1+1)+(field2+1)) as 'SALDO' FROM (...) 
+2

的可以在查詢選擇列表中使用別名來爲列指定不同的名稱。您可以在「GROUP BY」,「ORDER BY」或「HAVING」子句中使用別名來引用該列。查看手冊http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html。你在某種腳本中使用這個查詢,還是隻是sql? – piotrekkr

+0

你可以添加'tb_equipe','tb_gruposEquipes'和'tb_grupos'的表結構。這是一個漂亮的小web應用程序,以幫助組織調試:http://sqlfiddle.com/ – Stefan

回答

1

推的東西進入內部查詢

SELECT core.*, 
    (GP+(GC*-1)) as 'SALDO' 

    from (

    (SELECT COUNT(id_gol) FROM tb_gol as gol 
    INNER JOIN tb_jogo as jg ON(gol.fk_id_jogo = jg.id_jogo) 
    WHERE gol.ic_excluido != '*' AND gol.fk_id_equipe = e.id_equipe AND jg.fk_id_campeonato = g.fk_id_campeonato) as 'GP', 

    (SELECT COUNT(id_gol) FROM tb_gol as gol 
    INNER JOIN tb_jogo as jg ON(gol.fk_id_jogo = jg.id_jogo) 
    WHERE gol.ic_excluido != '*' AND gol.fk_id_equipe != e.id_equipe AND (jg.fk_id_equipe1 = e.id_equipe OR jg.fk_id_equipe2 = e.id_equipe) AND jg.fk_id_campeonato = g.fk_id_campeonato) as 'GC', 

    (SELECT COUNT(id_wo) as WOs FROM tb_wo as w INNER JOIN tb_jogo as j ON (w.fk_id_jogo = j.id_jogo) WHERE w.fk_id_equipe = e.id_equipe AND j.fk_id_campeonato = g.fk_id_campeonato) as 'WO') 


    FROM tb_equipe as e 

    ) as core 
    INNER JOIN tb_gruposEquipes as ge ON (core.id_equipe = ge.fk_id_equipe) 
    INNER JOIN tb_grupos as g ON (g.id_grupo = ge.fk_id_grupo) 
    WHERE g.fk_id_campeonato = 23 
    ORDER BY WO ASC