我有两张桌子:
tournament_teams:
ID TEAM TournamentID
2 Berp 7
3 Dang 7
tournament_pool_team:
ID TournamentID PoolID TeamID VersusTeamID
1 7 5 2 3
现在这个查询应该不返回任何内容,因为所有团队都在池中(teamid和versusteamid)
SELECT t1.id,
t1.team
FROM tournament_teams t1
WHERE t1.id NOT IN(SELECT t2.id
FROM tournament_pool_team t2
WHERE ( t2.teamid = t1.id
OR t2.versusteamid = t1.id )
AND poolid = '5')
AND t1.tournamentid = '7'
ORDER BY team ASC
我只想展示表中不存在的团队:Tournament_pool_team;团队在该表的teamid和versusteamid中指定。它需要从未在tournament_pool_team中指定的tournament_teams中拉出团队。使用当前条目时,它不应返回任何内容,因为在tournament_pool_team中指定了ID 2和3。
答案 0 :(得分:1)
您的子查询会返回tournament_pool_team的ID
,而tournament_teams id
中不存在该值,因此您的结果会出错。
使用Not Exists
运算符可帮助您找到tournament_pool_team的TeamID
或VersusTeamID
SELECT t1.id,
t1.team
FROM tournament_teams t1
WHERE NOT EXISTS (SELECT 1
FROM tournament_pool_team t2
WHERE ( t2.teamid = t1.id
OR t2.versusteamid = t1.id )
AND t2.poolid = '5')
AND t1.tournamentid = '7'
ORDER BY t1.team ASC
答案 1 :(得分:1)
SELECT t1.id,
t1.team
FROM tournament_teams t1
WHERE t1.id NOT IN(SELECT t2.teamid
FROM tournament_pool_team t2
WHERE t2.teamid = t1.id
AND poolid = '5'
UNION
SELECT t2.versusteamid
FROM tournament_pool_team t2
WHERE t2.versusteamid = t1.id
AND poolid = '5')
AND t1.tournamentid = '7'
ORDER BY team ASC
我已根据您的上下文(您尝试实现的方式)修改了查询。您将t1.teamid与t2.id匹配,而应将t1.id与t2.teamid和t2.versusteamid匹配
答案 2 :(得分:0)
还有另一种选择......从球队名单开始,在对阵两支球队的比赛中左联加入,只保留联赛结果为空的球队
SELECT
t1.id,
t1.team
FROM
tournament_teams t1
LEFT JOIN tournament_pool_team t2
t2.poolid = '5'
AND t1.TournamentID = t2.TournamentID
AND ( t1.id = t2.id
OR t1.id = t2.versusteamid )
where
t1.tournamentid = '7'
AND t2.id IS NULL
ORDER BY
team
我会有
的索引tournament_teams on ( TournamentID, ID )
tournament_pool_team on ( TournamentID, poolid )