假设我有一个名为clubmembership
的数据库,其中包含名称列,俱乐部列以及他们在该俱乐部中扮演的角色列。 Margrit这个名字会多次出现在name
栏中,或者是她在俱乐部里的次数。如果我想看看哪些人是缝纫俱乐部的成员,我的查询可能看起来像这样:
SELECT DISTINCT NAME FROM CLUBMEMBERSHIP
WHERE CLUB=’SEWING’
AND ROLE=’MEMBER’;
我的问题是,我无法弄清楚谁不在缝纫俱乐部。当然简单的不是'条款不起作用,因为有很多行没有出现缝纫。在这个数据库中如果有人不在缝纫俱乐部,缝纫不会出现在俱乐部下面,所以我想有一种方法可以加入不同的行同名下的名字'然后可能使用' not in'条款
我希望这是对这个问题的一个很好的解释。我一直在努力解决这个问题。
感谢您的帮助! 尼科尔
答案 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不喜欢外部链接,因为答案应该在这里,但这是一个很大的主题,不适合单个回复,因此我将简要介绍数据库规范化,然后阅读“加入”表。