只选择玩过特定游戏而不玩其他游戏的玩家

时间:2018-03-14 16:36:45

标签: mysql

我对SQL很陌生,而且我对我试图制作的查询感到难过。我有一个与此类似的数据集

播放器

masterID   firstName   lastName
11111      Rob         Caspian
22222      Bob         Harper
33333      Jon         Willow
44444      Ron         Anderson
55555      Doug        Blake

外观

masterID   gameName
11111      chess
11111      checkers
11111      chess
22222      chess
22222      chess
33333      monopoly
33333      monopoly
33333      monopoly
44444      chess
55555      risk
55555      chess

我想要归还所有玩家的名字和姓氏,他们只玩国际象棋而没有其他游戏。所以它应该归还鲍勃哈珀和罗恩安德森。

SELECT player.firstName, player.lastName from player, appearances where player.masterID = appearances.masterID and appearances.gameName = "chess";

我有一个查询,无论他们玩过什么其他游戏,都会让所有下过国际象棋的人回归,但我无法弄清楚如何将它限制在只下棋的玩家身上。它也应该只返回一次球员的名字。谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

您可以在查询末尾添加另一个过滤器,以过滤掉其他游戏中显示的MasterID:

SELECT player.firstName, player.lastName 
from player
join appearances on player.masterID = appearances.masterID  
where appearances.gameName = 'chess'
and masterID not in(select masterID from Appearances where gameName != 'chess')

答案 1 :(得分:1)

您只需使用joinaggregation即可获得结果,如下图所示。

SELECT A.firstName, A.lastName
FROM Player A LEFT JOIN Appearances B
ON A.masterID=B.masterID
GROUP BY A.firstName, A.lastName
HAVING SUM(B.gameName = 'chess')=COUNT(*);

run on SQL Fiddle