2015-03-29 3 views
0

Я пытаюсь написать SQL-запрос для базы данных библиотеки с использованием MySQL. Существуют две таблицы shelf(studentnumber, booknumber) и booklist(booknumber,booktitle,language). В таблицах списков книг есть 4 разных языка, а именно italian, spanish, hungarian, german.Использование NOT EXISTS для выбора ВСЕХ членов

Я хочу изучить 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'); 

Пример вывода: Когда смотришь на полки и Booklist таблиц, вы видите, что студент студент не 2 читать все книги на немецком языке и студент со студенческим номером 3 читал все книги на венгерском языке. Но нет ученика, который прочитал все книги на итальянском или испанском языках.

Последняя часть кода будет такой, как указано ниже, но я не мог построить первую часть, возможно, она будет включать в себя NOT EXISTS SELECT booknumber FROM booklist WHERE language = 'italian';

+0

Да, рассмотрите вопрос о предоставлении надлежащих DDL и/или sqlfiddle AND THE DE SIRED RESULT SET – Strawberry

+1

Хорошее горе. Измените свой вопрос. – Strawberry

+0

@tpanic Отформатируйте свой вопрос правильно. – Beginner

ответ

0

Это должно работать хорошо для вас:

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 

Вы можете также добавить в первый выберите язык заявление и COUNT (*), который предоставит Вам дополнительную информацию (язык, который они прочитали вместе с количеством книг), т.е.

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

Выход

2, german, 2 
3, hungarian, 3 

Update

Для отображения всех студентов, которые читают книги в указанном языке (по желанию в комментариях), просто добавить предложение 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 
+0

Спасибо, что сработало правильно. – tpanic

+0

@tpanic отлично, пожалуйста, не забудьте принять ответ тогда (поэтому вопрос закрывается :) – gudthing

+0

, но я также хочу найти студента, который читает все книги с языка: например, в разделе where where = 'german 'и результат должен быть 2 и где language =' hungarian ', и результат должен быть 3. как сделать эту модификацию. – tpanic

Смежные вопросы