SQL(Mysql)NOT IN与OR结合,结果错误

时间:2014-12-25 15:15:49

标签: mysql sql

我有两张桌子:

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。

3 个答案:

答案 0 :(得分:1)

您的子查询会返回tournament_pool_team的ID,而tournament_teams id中不存在该值,因此您的结果会出错。

使用Not Exists运算符可帮助您找到tournament_pool_team的TeamIDVersusTeamID

中不存在的tournament_teams
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 )