2012-08-02 110 views
1

我在這裏呼籲MySQL勇士。我的問題是,我需要在子查詢的左外連接中使用對外部查詢表的引用。 我知道這是不可能的,但我不知道如何用外部查詢中的典型聯接替換子查詢過濾。引用子查詢中的外部查詢JOIN

我會舉一個典型的例子來說明我的問題。

這是奧運會,我有幾支球隊(比如說乒乓球隊),其中有1對N的球員。 當兩名球員的所有球員都與對手的所有球員對陣時,兩隊之間的比賽結束。 簡單地說,我有3個表:

Team (id, country); 
Player (id, team_id, name) 
Game (id, playerA_id, playerB_id). 

我想搜索已沒有爭議或沒有每場比賽對所有的對方球隊的球員所有球員(和誰不是我的團隊明顯)。 這裏是我的查詢:

SELECT t.*, p.* 
FROM player p 
INNER JOIN team t ON t.id = p.team_id AND t.id != My_Team_ID 
WHERE EXISTS (
    -- If an opposing team's player has played no game => game.id is NULL 
    -- If he hasn't played against all of my teammates => there will be at least one row where game.id is NULL 
    SELECT * 
    FROM player 
    INNER JOIN team ON team.id = player.team_id AND team.id = My_Team_ID 
    LEFT OUTER JOIN game ON player.id IN (game.playerA_id, game.playerB_id) AND p.id IN (game.playerA_id, game.playerB_id) 
    WHERE game.id IS NULL 
) 

我已經把轉儲出於實用的目的:http://pastebin.com/HW3L5ukz 我試圖把LEFT OUTER在子查詢的WHERE JOIN的第二個條件,但它不會返回適當的結果。

有關如何實現這一點的任何想法? 在此先感謝

+0

http://en.wikipedia.org/wiki/Correlated_subquery? – 2012-08-02 14:14:14

+0

如果Game和Game_Player是單獨的表格,這會更容易。 – 2012-08-02 14:15:10

+0

@MarcB:我試過了,但沒有返回正確的結果;如果我用我的p.id替換玩家的ID來單獨鍵入我的子查詢,它會起作用,但如果我將«LEFT OUTER JOIN p.id IN(game.playerA_id,game.playerB_id)»作爲「WHERE p.id IN game.playerA_id,game.playerB_id)»,它沒有。我做了一個測試,一個對手沒有和所有人對陣過,另一個對手在左外接的情況下得到了我的球員 - 與在WHERE時相反。 – rgandoin 2012-08-02 14:23:18

回答

1
SELECT p1.*, p2.* 
FROM player p1 
JOIN team t1 
    ON t1.id = p1.team_id AND t1.id = My_Team_ID 
LEFT JOIN player p2 
    ON p2.id != p1.id 
JOIN team t2 
    ON t2.id = p2.team_id AND t2.id != My_Team_ID 
LEFT JOIN game g1 
    ON (g1.playerA_id = p1.id OR g1.playerB_id = p1.id) 
    AND (g1.playerA_id = p2.id OR g1.playerB_id = p2.id) 
WHERE g1.id IS NULL 

如果我使用1 My_Team_ID,我得到下面的結果,它顯示了剩餘的比賽:

id team_id name   id team_id  name 
1 1  Laurent Dupuis 6 2   Alec Russell 
2 1  Stéphane Leroy 6 2   Alec Russell 
3 1  Julien le Guen 4 2   Mark Johnsson 
3 1  Julien le Guen 6 2   Alec Russell 
+0

感謝Marcus,它的作用像一個魅力。事實上,我真正的疑問要複雜一點,所以我跳得更復雜了。但有了這個簡單的例子和​​你的答案,它顯而易見。 – rgandoin 2012-08-02 15:02:45