0

假设我有一个名为的数据库clubmembership,其中有一个名称列、一个俱乐部列和一个他们在该俱乐部中扮演的角色的列。玛格丽特这个名字会在专栏中出现name很多次,或者与她在俱乐部中出现的次数一样多。如果我想查看哪些人是缝纫俱乐部的成员,我的查询可能如下所示:

SELECT DISTINCT NAME FROM CLUBMEMBERSHIP
WHERE CLUB=’SEWING’
AND ROLE=’MEMBER’;

我的问题是我无法查询谁不在缝纫俱乐部。当然,简单的“不在”子句不起作用,因为有很多行没有出现缝纫。在这个数据库中,如果有人不在缝纫俱乐部,缝纫不会出现在俱乐部下,所以我想有一个在“名称”下连接具有相同名称的不同行然后可能使用“不在”子句的方法

我希望这是对这个问题的一个很好的解释。我一直在努力解决这个问题。

谢谢你的帮助!妮可

4

2 回答 2

0

如果我理解正确,您想列出所有不属于SEWING. 内部查询将获取属于 的所有名称,SEWING但是,NOT EXISTS运算符将获取内部查询中未找到的所有名称。

SELECT  DISTINCT C.NAME
FROM    CLUBMEMBERSHIP C
WHERE   C.ROLE = 'MEMBER'
        NOT EXISTS
        (
            SELECT NULL 
            FROM CLUBMEMBERSHIP D
            WHERE D.CLUB='SEWING' 
                    AND D.ROLE='MEMBER'
                    AND C.NAME = D.NAME
        )

这是一个演示

于 2018-02-21T10:26:33.807 回答
0

这不是仅仅通过更改现有代码就可以解决的问题,它与数据库设计有关。

数据库规范化是将数据库整理成合理的表的过程。

如果您多次添加一个人,那么您应该创建一个名为的表members。如果有俱乐部列表,那么您应该创建一个clubs表。

然后,您可以创建一个表将它们连接在一起。

这是你的三张桌子:

members
-------
id (int)
name (varchar)

clubs
-------
id (int)
name (varchar)

memberships
-------
member_id (int)
club_id (int)

然后你可以在 MySQL 中使用 join 来返回你需要的信息。

Stack Overflow 不喜欢外部链接,因为答案应该在这里,但这是一个巨大的话题,不适合单个回复,所以我会简要阅读有关数据库规范化的内容,然后阅读有关“加入”表的内容。

于 2018-02-21T10:31:56.020 回答