如何用SQL查询未加入指定球队的用户创建球员
需求说明
需要在下拉视图中展示尚未加入指定球队(TeamID=14)的球员,具体要求:
- 球员由UID=2的用户创建
- 需获取球员的PID、PlayerID信息
现有SQL语句的问题:使用=能正确获取已加入该球队的球员,但改为<>时,仅会显示未在当前球队但加入了其他球队的球员,无法覆盖完全未加入任何球队的情况。
现有SQL:
SELECT DISTINCT Player_tbl.* FROM PlayerTeam_tbl LEFT JOIN Player_tbl ON Player_tbl.PID = PlayerTeam_tbl.PlayerID WHERE TeamID <> 14 AND UID = 2
数据表结构
球员表(Player_tbl)
| PID | 名字(Fornamn) | 号码(Number) | 是否教练(Coach) | 创建者UID(UID) |
|---|---|---|---|---|
| 15 | Stephen | 85 | 2 | |
| 16 | Axel | 47 | 否(nej) | 2 |
| 17 | Kaspar | 32 | 否(nej) | 2 |
| 18 | Mats | 66 | 否(nej) | 2 |
| 19 | Oskar | 99 | 否(nej) | 2 |
球队表(Team_tbl)
| TID | 组别(Division) | 球队名称(Team) | 特点(Strength) | 球队创建者UID(TemUID) |
|---|---|---|---|---|
| 14 | u20 | KFUM... | bankvarmare | 2 |
| 17 | u17 | Malmo | mangd | 2 |
| 20 | u14 | KFUM... | give and go | 2 |
| 21 | u17 | Frovi FC | Maximus | 2 |
| 23 | u14 | Rovani... | 100 | 2 |
| 24 | u20 | Matss... | programering | 3 |
| 25 | u14 | test | testar | 2 |
| 26 | u17 | kalle k... | iq | 2 |
| 27 | u20 | London | vet inte | 5 |
球员球队关联表(PlayerTeam_tbl)
| PTID | 球员ID(PlayerID) | 球队ID(TeamID) | 球队创建者UID(TeamUID) |
|---|---|---|---|
| 5 | 15 | 15 | 2 |
| 11 | 15 | 17 | 2 |
| 16 | 15 | 23 | 2 |
| 60 | 18 | 17 | 2 |
| 63 | 17 | 17 | 2 |
| 75 | 19 | 14 | 2 |
| 77 | 16 | 14 | 2 |
| 80 | 17 | 14 | 2 |
正确SQL写法
方法1:使用NOT EXISTS子查询
SELECT PID AS PlayerID, PID FROM Player_tbl WHERE UID = 2 AND NOT EXISTS ( SELECT 1 FROM PlayerTeam_tbl WHERE PlayerTeam_tbl.PlayerID = Player_tbl.PID AND PlayerTeam_tbl.TeamID = 14 )
方法2:左连接后筛选NULL值
SELECT DISTINCT p.PID AS PlayerID, p.PID FROM Player_tbl p LEFT JOIN PlayerTeam_tbl pt ON p.PID = pt.PlayerID AND pt.TeamID = 14 WHERE p.UID = 2 AND pt.PlayerID IS NULL
逻辑说明
- 原SQL的问题:将
TeamID <>14放在WHERE子句中,会过滤掉关联表中TeamID为14的记录,同时也会排除完全未加入任何球队的球员(左连接后这类球员的TeamID为NULL,NULL与任何值比较结果为未知,会被WHERE条件过滤)。 - 方法1逻辑:先筛选出UID=2创建的所有球员,再排除已加入TeamID=14的球员,不受其他球队关联记录影响。
- 方法2逻辑:将球员表与关联表按
TeamID=14做左连接,未加入该球队的球员(含未加入任何球队的)在关联表中的字段会是NULL,筛选这类NULL记录即可得到目标结果。
内容的提问来源于stack exchange,提问作者GrapeBoy
相关产品推荐
相关产品推荐

