如何使用MYSQL在一个表中连接具有相同名称的所有行?

时间:2018-02-21 10:21:24

标签: mysql query-help

假设我有一个名为clubmembership的数据库,其中包含名称列,俱乐部列以及他们在该俱乐部中扮演的角色列。 Margrit这个名字会多次出现在name栏中,或者是她在俱乐部里的次数。如果我想看看哪些人是缝纫俱乐部的成员,我的查询可能看起来像这样:

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

我的问题是,我无法弄清楚谁不在缝纫俱乐部。当然简单的不是'条款不起作用,因为有很多行没有出现缝纫。在这个数据库中如果有人不在缝纫俱乐部,缝纫不会出现在俱乐部下面,所以我想有一种方法可以加入不同的行同名下的名字'然后可能使用' not in'条款

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

感谢您的帮助! 尼科尔

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望列出不属于SEWING成员的所有名称。 Inner 查询将获取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
        )

这里是Demo

答案 1 :(得分:0)

这不是只需更改现有代码就可以解决的问题,而是与数据库设计有关。

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

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

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

这是你的三张桌子:

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

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

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

然后,您可以在MySQL中使用联接来返回所需的信息。

Stack Overflow不喜欢外部链接,因为答案应该在这里,但这是一个很大的主题,不适合单个回复,因此我将简要介绍数据库规范化,然后阅读“加入”表。