我有以下数据库架构:
玩家表:
| 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')
非常感谢任何帮助。
答案 0 :(得分: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'
的游戏的玩家。
答案 1 :(得分:0)
执行此操作时:
compile 'org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106'
compile 'org.eclipse.jetty.websocket:websocket-common:9.1.0.v20131115'
您有效地将左连接转换为内连接。要在外部联接表上进行筛选,请在from子句中执行此操作。
select *
from t1 left join t2 on something
WHERE t2.someField = someValue
AND other conditions