多对多关系:选择不在特定团队中的玩家

时间:2012-05-08 22:06:04

标签: mysql sql group-by left-join

我试过研究这个,但不确定要搜索什么。我有一个players表和一个团队表和一个链接表。玩家可以在多个团队中。

我需要选择不在XYZ队伍中的所有球员。

我试过了:

SELECT * FROM players LEFT JOIN linker ON players.playerID = linker.playerID
WHERE NOT linker.teamID = 'XYZ'

然后玩家多次返回并且我得到误报(假设玩家在团队XYZ,ABC和LMNOP上 - 玩家返回两次)。

我尝试使用GROUP BY players.playerID来处理重复项。但后来我得到误报,XYZ上的玩家出现在列表中。

我确信有些东西我不见了。

(P.S。我需要这个的原因是建立一个可以添加到球队的球员名单,即那些尚未加入球队的球员。)

1 个答案:

答案 0 :(得分:4)

使用NOT IN

SELECT * 
FROM players 
WHERE playerID NOT IN
      ( SELECT playerID  
        FROM linker 
        WHERE teamID = 'XYZ'
      )

使用LEFT JOIN - IS NULL,您的尝试已更正:

SELECT players.* 
FROM players 
  LEFT JOIN linker 
    ON  linker.playerID = players.playerID 
    AND linker.teamID = 'XYZ'
WHERE linker.playerID IS NULL

使用NOT EXISTS

SELECT * 
FROM players 
WHERE NOT EXISTS
      ( SELECT *
        FROM linker 
        WHERE linker.playerID = players.playerID 
          AND linker.teamID = 'XYZ'
      )