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
我想这正是我需要的。非常感谢。这种方法比左连接简单得多。我想这正是我需要的。非常感谢。这种方法比左连接容易得多。