首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:找出至少和一个人在同一个俱乐部里的人的名字。

SQL:找出至少和一个人在同一个俱乐部里的人的名字。
EN

Stack Overflow用户
提问于 2015-03-22 04:20:09
回答 4查看 144关注 0票数 0

我有一张桌子:俱乐部(俱乐部名称,会员名称)

代码语言:javascript
复制
photography | Jim
photography | Eve
photography | Alex
woodworking | Jim
woodworking | Alex
cooking     | Alex

我怎样才能找到至少和吉姆在同一个俱乐部的人的名字呢?

在这个例子中,我想返回Alex。

我知道如何找到和吉姆一样的俱乐部里人的名字。

代码语言:javascript
复制
SELECT DISTINCT C1.membername
FROM clubname C1, clubname C2
WHERE C1.clubname = C2.clubname AND C2.membername = 'Jim" AND C1.membername <> 'Jim'

但我该如何具体说明我只想要和吉姆在同一家俱乐部的人呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-22 05:11:36

您可以使用多种方法,其中一种方法是使用where not exists,如下所示:

代码语言:javascript
复制
SELECT DISTINCT C1.membername
FROM club C1 
WHERE NOT EXISTS (
    SELECT C2.membername
    FROM club C2 LEFT OUTER JOIN club C3 ON C2.clubname=C3.clubname 
    AND C3.membername=C1.membername
    WHERE C2.membername = 'Jim' AND C3.membername IS NULL
)
AND C1.membername !=  'Jim'

刚刚用T,这是演示试过了。

票数 0
EN

Stack Overflow用户

发布于 2015-03-22 05:59:06

我正在寻找一个解决方案,类似于一个集合差分运算符,这基本上是链接PM 77-1张贴。

这就是我最后得到的:

代码语言:javascript
复制
SELECT membername
FROM club
WHERE clubname NOT IN (
    SELECT C.clubname
    FROM club C
    WHERE C.clubname NOT IN (
        SELECT clubname
        FROM club
        WHERE membername = 'Jim'
    )
)
AND membername <> 'Jim'
GROUP BY membername
HAVING COUNT(membername) = (
    SELECT COUNT(*)
    FROM club
    WHERE membername = 'Jim'
)

谢谢你的帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-03-22 04:23:49

如果您的俱乐部少于32个,请为每个俱乐部分配一个二进制标志值:

代码语言:javascript
复制
photography     1
cooking         2
woodworking     4
etc..  8, 16, 32, 64, 128, 256....

然后和Jim的成员和他们的成员之和,检查是否所有Jim的位都是在这个值中设置的(按位和)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29190954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档