使用 NOT EXISTS 选择所有成员

Posted

技术标签:

【中文标题】使用 NOT EXISTS 选择所有成员【英文标题】:Usage of NOT EXISTS to select ALL members 【发布时间】:2015-03-29 08:26:26 【问题描述】:

我正在尝试使用 mysql 为图书馆数据库编写 SQL 查询。 有两个表shelf(studentnumber, booknumber)booklist(booknumber,booktitle,language)。书单表条目中有 4 种不同的语言,即italian, spanish, hungarian, german

我想了解已阅读所选语言所有书籍的studentnumbers

表格示例数据:

create table shelf(studentnumber INT, booknumber INT); 

INSERT INTO shelf values(1,1),(1,2),(1,3),(2,1),(2,3)(2,4),(2,5),
                        (2,6),(3,6),(3,7)(3,8),(3,9); 

create table booklist(booknumber INT, booktitle VARCHAR(50), language VARCHAR(10); 

INSERT INTO booklist values(1, 'FirstBook', 'italian'),(2,'SecondBook', 'spanish'),
(3,'ThirdBook','italian'),(4,'FourthBook','german'),(5,'FifthBook','german'),
(6, 'SixthBook','spanish'),(7,'SeventhBook','hungarian'),(8,'EightBook','hungarian'),
(9,'NinthBoo‌​k','hungarian'),(10,'TenthBook','Spanish'),(11,'EleventhBook', 'italian');

样本输出: 当您查看书架表和书目表时,您会看到学生编号 2 的学生阅读了所有德语书籍,而学生编号 3 的学生阅读了所有匈牙利语书籍。 但是没有一个学生读过所有意大利文或西班牙文的书。

代码的最后一部分如下所示,但我无法构造第一部分,可能会包含NOT EXISTS SELECT booknumber FROM booklist WHERE language='italian';

【问题讨论】:

是的,考虑提供适当的 DDL 和/或 sqlfiddle 以及所需的结果集 好悲痛。编辑您的问题。 @tpanic 正确格式化您的问题。 正确的 DDL,谢谢 - 这样我们就可以复制问题。并删除上面的 cmets。字符串需要逗号 格式化完毕,够清楚了吗? 【参考方案1】:

这应该很适合你:

select studentnumber 
from shelf s1 join booklist b1 on s1.booknumber=b1.booknumber
group by studentNumber, language
having count(language) >= (
        select count(*) from booklist b2
        where b1.language=b2.language
        group by b2.language)

输出:

2
3

您还可以添加第一个选择语句语言和计数(*),这将为您提供更多信息(他们阅读过的语言以及书籍数量),即

select studentnumber,language,count(*) 
//rest of code

输出

2, german, 2
3, hungarian, 3

更新

要显示所有阅读过指定语言书籍的学生(根据 cmets 的要求),只需添加 WHERE 子句:

select studentnumber
from shelf s1 join booklist b1 on s1.booknumber=b1.booknumber
where language='german'
group by studentNumber, language
having count(language) >= (
        select count(*) from booklist b2
        where b1.language=b2.language
        group by b2.language)

输出:

2

【讨论】:

@tpanic 太好了,请不要忘记接受答案(这样问题就结束了:) 但我还想找到从一种语言阅读所有书籍的学生编号:例如,在 where 子句中 language='german' 并且结果应该是 2 并且 where language='hungarian' 和结果应该是 3. 如何进行修改。

以上是关于使用 NOT EXISTS 选择所有成员的主要内容,如果未能解决你的问题,请参考以下文章