我在SQL数据库中的两个表上有一个M2M关系,如下所示:
Players
-------
Name
ID
Teams
------
Name
ID
PlayersTeams
------
PlayerID
TeamID
一个团队由一名或多名球员组成。
我想查询一个给出其玩家ID的团队,并仅返回包含正是那些玩家的团队,不多也不少。所以询问一支有球员的球队(1,2,3)只能让球员1,2,3回归球队,而不是一队球员1,2,3,4。
这可以在一个查询中实现吗?
我有一个sqlfiddle我正试图在这里解决它:http://sqlfiddle.com/#!2/27799/8
在那个例子中,我希望通过查询玩家ID 1和2来选择团队“john and mick”......
更新 在这个sqlfiddle http://sqlfiddle.com/#!2/27799/69我可以选择团队ID 2(“john和mick”),但它也获得团队ID 4(“john,mick和trev”)。需要将其过滤到JUST 2。
答案 0 :(得分:3)
select TeamId
from PlayersTeams
group by TeamId
having count(*) = sum(case when playerid in (1,2) then 1 else 0 end)
and count(*) = 2
不熟悉mysql所以我不知道如何让玩家列表长度(count(*) =2
)完全动态,但你明白了。
答案 1 :(得分:0)
我在第3组中添加了第3个玩家以创建所有可能的案例。这是我的答案:
SELECT t.*
FROM playersteams a,
teams t
WHERE a.teamid = t.id
AND (SELECT COUNT(*) FROM playersteams c
WHERE c.teamid = a.teamid
AND c.playerid = 2) = 1
AND (SELECT COUNT(*) FROM playersteams c
WHERE c.teamid = a.teamid
AND c.playerid = 3) = 1
GROUP BY t.id, t.name
HAVING COUNT(a.playerid) = (SELECT COUNT(*) FROM players WHERE id IN (2,3));
SQL小提琴:demo