MYSQL选择包含另一个查询中的所有内容的元素

时间:2012-04-03 03:13:09

标签: mysql subquery

我有一个基于库系统的数据库,我正在努力增强我对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 个答案:

答案 0 :(得分:1)

在收集独特的借用者 - 标题组合(使用DISTINCT)后,您可以使用GROUP BYHAVING识别那些书帖数量相当于现有书签总数的借款人:

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)

答案 1 :(得分:0)

怎么样:

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)