【问题标题】:Selecting relation with exact keys in a many to many在多对多中选择与精确键的关系
【发布时间】:2014-06-07 19:24:08
【问题描述】:

我在一个 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 进行查询来选择球队“john and mick”...

更新 在这个 sqlfiddle http://sqlfiddle.com/#!2/27799/69 我可以选择团队 ID 2(“john and mick”),但它也可以选择团队 ID 4(“john, mick and trev”)。需要将其过滤到 JUST 2。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • @a_horse_with_no_name postgres

标签: sql postgresql m2m


【解决方案1】:
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)是完全动态的,但你明白了。

【讨论】:

  • 太棒了!与我的逻辑相同,但更漂亮。
【解决方案2】:

我在团队 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2017-09-26
    • 2018-06-25
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多