选择与多对多精确键的关系

时间:2014-04-23 06:13:34

标签: sql postgresql m2m

我在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。

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