MYSQL выбор элементов, содержащих все в другом запросе - PullRequest
1 голос
/ 03 апреля 2012

У меня есть база данных, основанная на библиотечной системе, и я пытаюсь расширить свои знания о запросах MYSQL. Я хочу попытаться перечислить имена заемщиков, которые позаимствовали все названия книг в базе данных.

Запрос, который мне нужно урезать,

SELECT b.BorName
FROM Borrower b
JOIN Loan l ON l.BorId = b.BorId
JOIN BookCopy bc ON bc.BcId = l.BcId
JOIN BookTitle bt ON bt.BtId = bc.BtId

И я предполагаю, что мне нужно использовать bt.BtName, которое является названием каждой книги в запросе выше, а также подзапрос SELECT bt.BtName FROM BookTitle bt, но у меня нет слов или запросов, чтобы сделать это со всем списком.

Мне нужно сравнить первую таблицу с каждой строкой во втором запросе, но я еще не нашел способ сделать это.

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

После сбора уникальных комбинаций названия заемщика (с DISTINCT) вы можете идентифицировать этих заемщиков по количеству буклетов, эквивалентному общему количеству существующих заголовков, используя GROUP BY и HAVING:

SELECT BorName FROM (
  SELECT DISTINCT b.BorName, bt.BtId
  FROM Borrower b
  JOIN Loan l ON l.BorId = b.BorId
  JOIN BookCopy bc ON bc.BcId = l.BcId
  JOIN BookTitle bt ON bt.BtId = bc.BtId
) borrowers_titles
GROUP BY BorName
HAVING Count(*) IN (SELECT Count(*) FROM BookTitle)
0 голосов
/ 03 апреля 2012

А как же:

SELECT b.BorName, bt.BtName
FROM loan as l 
LEFT JOIN Borrower as b
   ON l.BorId = b.BorID
LEFT JOIN BookCopy as bc 
   ON bc.BcId = l.BcId
LEFT JOIN BookTitle as bt 
   ON bt.BtId = bc.BtId
GROUP BY b.BorName

, которая получает все имена и книги, взятые в долг, сгруппированные (или упорядоченные) именем заемщика. Теперь это звучало так, как будто вы хотите узнать имена людей, которые позаимствовали каждую книгу в библиотеке? Если так:

SELECT b.BorName
Borrower as b
WHERE 
   (SELECT count(distinct BtId) FROM BookTitle) = 
        (SELECT count(distinct bc.BcID) FROM BookCopy as bc WHERE bc.BorID = b.BorID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...