2014-04-23 148 views
0

我有一個SQL數據庫上的兩個表的M2M關係,如下:選擇關係到許多

Players 
------- 
Name 
ID 

Teams 
------ 
Name 
ID 

PlayersTeams 
------ 
PlayerID 
TeamID 

團隊由1名以上的玩家。

我想查詢一個給定其球員ID的球隊,並且只返回包含的球隊,這些球員恰好是那些球員,不多不少。因此,查詢一個擁有球員的球隊(1,2,3)只會讓球隊回到球員1,2,3,而不是球員1,2,3,4。

這是可能在一個單一的查詢?

我有一個sqlfiddle我試圖去解決它在這裏:在例如http://sqlfiddle.com/#!2/27799/8

我想通過與玩家ID查詢到能夠選擇團隊「約翰和米克」 1和2 ...

更新 在這sqlfiddle http://sqlfiddle.com/#!2/27799/69我可以選擇團隊ID 2( 「約翰和米克」),但它也得到團隊ID 4( 「約翰,米克和崔佛」)。需要過濾到JUST 2.

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

@a_horse_with_no_name postgres – market

回答

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)提出的是完全動態的,但你明白了。

+0

太棒了!相同的邏輯,但比我的更漂亮。 – MinhD

+0

非常優雅的解決方案,謝謝。 – market

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