2016-01-22 55 views
0

我有以下的數據庫模式:LEFT JOIN同桌多次

Players表:

| player_id | 
|-----------| 
|  1  | 
|  2  | 
|  3  | 
|  4  | 
| ... | 

遊戲表:

| game_id | white_player_id | black_player_id | game_status | 
|----------|-----------------|-----------------|-------------| 
| 1  |  1  |  2  | in progress |  
| 2  |  3  |  4  | in progress | 
| 3  |  5  |  6  | white won | 
| 4  |  1  |  3  |  draw | 
| ... |  ...  |  ...  |  ...  | 

我想選擇所有的球員,誰不是目前播放。

我試圖用以下方式實現它,但它不能像我期望的那樣工作。

SELECT player.player_id 
FROM players 
LEFT JOIN games g1 
    ON players.player_id = g1.white_player_id 
LEFT JOIN games g2 
    ON players.player_id = g2.black_player_id 
WHERE 
    g1.white_player_id IS NULL AND 
    g1.game_status NOT IN ('in progress') OR 
    g2.white_player_id IS NULL AND 
    g2.game_status NOT IN ('in progress') 

任何幫助將不勝感激。

回答

2

試試這個:

SELECT player_id 
FROM players 
WHERE player_id NOT IN (
    SELECT white_player_id 
    FROM games 
    WHERE game_status IN ('in progress') 

    UNION ALL 

    SELECT black_player_id 
    FROM games 
    WHERE game_status IN ('in progress')) 

此查詢選擇不參與遊戲與等於game_status'in progress'所有玩家。

+0

我想那正是我需要的。謝謝。這種方法比左連接更容易。 – koryakinp

0

當你這樣做:

select * 
from t1 left join t2 on something 
WHERE t2.someField = someValue 
AND other conditions 

您有效地轉換左連接到內連接。要在外部連接表上過濾,請在from子句中進行。

select * 
from t1 left join t2 on something 
AND t2.someField = someValue 
WHERE other conditions 
+0

謝謝先生, – koryakinp