2013-10-08 116 views
0

我需要顯示所有燈具爲當前用戶(誰扮演「反對」誰),所以我寫的SQL查詢選擇VS JOIN

SELECT 
    fixture.* 
FROM 
    sport_team_player AS team_player, sport_team AS team 
INNER JOIN sport_fixture AS fixture 
    ON (`team_player`.`team_id` = fixture.`team1_id` OR `team_player`.`team_id` = fixture.`team2_id`) 
WHERE 
    team_player.`team_id` = team.`team_id` AND team_player.`player_id` = '16' 

而且這並不工作,並告訴我,team_player .team_id不存在

但如果我加入第二個表而不是從多個表中選擇,它的工作原理很好。

PS。這是不寫這樣的查詢的最佳方式,但它是由ORM模塊生成..

編輯:

結果將是固定的數據列表一樣

------------------------------ 
|fixture_id|team1_id|team2_id| 
------------------------------ 
|1   | 2  | 3  | 
------------------------------ 
+1

請給我們一部分預期結果 – cameronjonesweb

+0

什麼是確切的錯誤信息?這可能是因爲你正在混合JOIN和逗號運算符,它會在'on子句'中給你一個未知列'col_name'。請參閱[mysql手冊](http://dev.mysql.com/doc/refman/5.0/en/join.html) –

+0

@OcasoProtal是的,但爲什麼它的工作,如果我加入第二個表而不是逗號? – insanebits

回答

0

逗號運算符的優先級小於INNER JOIN,CROSS JOIN,LEFT JOIN。這就是爲什麼當您將逗號與其他連接表運算符混合時['on子句'中的未知列'col_name']發生錯誤。如果您指定的交叉連接(獲取前兩個表的笛卡爾乘積),而不是逗號相同的查詢將工作,因爲那時在FROM子句中的表運營商將進行評估,從左至右依次爲:

SELECT 
    fixture.* 
FROM 
    sport_team_player AS team_player 
    cross join sport_team AS team 
    INNER JOIN sport_fixture AS fixture 
    ON (team_player.team_id = fixture.team1_id OR team_player.team_id = fixture.team2_id) 
WHERE 
    team_player.team_id = team.team_id AND team_player.player_id = '16' 
+0

你是第一個有正確答案,接受並感謝:) – insanebits

+0

交叉連接不保證在這裏。 – Strawberry

2

試試這一個。應該導致與您的查詢相同的查詢;

SELECT fixture.* 
FROM sport_team_player AS team_player 
JOIN sport_team AS team 
ON team_player.`team_id` = team.`team_id` AND team_player.`player_id` = '16' 
INNER JOIN sport_fixture AS fixture 
ON (`team_player`.`team_id` = fixture.`team1_id` 
    OR `team_player`.`team_id` = fixture.`team2_id`) 

建立連接時不應混淆兩個符號。用於加入team_player和團隊的逗號以及後續對內部連接的調用很可能會觸發未知的列錯誤。

+0

這一個按預期工作,我也告訴過,如果我使用連接而不是逗號,它可以工作,但爲什麼不用逗號工作? – insanebits

+1

參考這個[鏈接](http://stackoverflow.com/questions/11179991/mixing-ansi-1992-joins-and-commas-in-a-query) –

+0

@insanebits'JOIN's給你更多的控制你獲取什麼數據,並且總結了一種更清潔的方式來聚合SQL,習慣了'JOIN's,它們比你想象的更容易處理 – DanFromGermany

0

例如:

SELECT f.* 
    FROM sport_team_player p 
    JOIN sport_team t 
    ON t.team_id = p.team_id 
    JOIN sport_fixture f 
    ON p.team_id IN(f.team1_id,f.team2_id) 
WHERE p.player_id = 16;