我试过研究这个,但不知道该找什么。我有一个players表、一个teams表和一个linker表。一个玩家可以在多个团队中。
我需要选择所有不在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上的玩家出现在名单上。
我肯定我少了点什么。
(注:我需要这样做的原因是要建立一个可以添加到团队中的球员列表,即尚未加入团队的球员。)

最佳答案

使用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'
      )

关于mysql - 多对多关系:选择不在特定团队中的球员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10507245/

10-11 17:33