Sql 多次左键连接同一个表

Sql 多次左键连接同一个表,sql,select,join,Sql,Select,Join,我有以下数据库架构: 玩家表: | player_id | |-----------| | 1 | | 2 | | 3 | | 4 | | ... | 游戏桌: | game_id | white_player_id | black_player_id | game_status | |----------|-----------------|-----------------|---------

我有以下数据库架构:

玩家表:

| 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')
任何帮助都将不胜感激。

试试以下方法:

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\u游戏的玩家。
尝试以下操作:

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'))
当您执行以下操作时,此查询将选择所有未参与状态为“进行中”的
游戏的玩家:

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
执行此操作时:

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

我想这正是我需要的。非常感谢。这种方法比左连接简单得多。我想这正是我需要的。非常感谢。这种方法比左连接容易得多。