0

次のように、SQL データベースの 2 つのテーブルに 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 ("john and mick") を選択できますが、チーム ID 4 ("john, mick and trev") も取得します。JUST 2 までフィルタリングする必要があります。

4

2 に答える 2

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) を完全に動的にする方法がわかりませんが、要点はわかります。

于 2014-04-23T07:09:24.940 に答える
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 フィドル:デモ

于 2014-04-23T07:04:30.170 に答える