mysql - 使用 NOT EXISTS 选择所有成员

标签 mysql where-clause exists

我正在尝试使用 MySQL 为图书馆数据库编写 SQL 查询。 有两个表shelf(studentnumber, booknumber)booklist(booknumber,booktitle,language)。图书列表条目中有 4 种不同的语言,即意大利语、西类牙语、匈牙利语、德语

我想了解已阅读所选语言的所有书籍的学生人数

表的示例数据:

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 从书单中选择书号 WHERE language='italian';

最佳答案

这应该很适合你:

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

更新

要显示所有读过指定语言书籍的学生(按照评论中的要求),只需添加 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

关于mysql - 使用 NOT EXISTS 选择所有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29327095/

相关文章:

php - 如何解决 r57shell_php_php 警告?

mysql - grails 可以在同一个应用程序中与 MySQL 和 MongoDB 一起工作吗?

database - 将查询 JOIN 重写为 EXISTS

php - Codeigniter- 检查用户在一个月内是否存在

MySQL 值 0 或 1,如果行存在于其他表中

php - 当进行相同的 PDO 查询(参数不断变化)时,我是每次都调用prepare(),还是只调用一次?

mysql - MySQL中如何向表中插入数据

MySQL 查询 - 仅选择特定行的最新结果?

mysql - 获取每组前 X 天的收入

mysql - 其中 'foo' 或 'bar' 和 'lol' 或 'rofl' MySQL