2012-04-03 13 views
1

私はライブラリシステムをベースにしたデータベースを持っており、MYSQLクエストの知識を強化しようとしています。 私は、データベース内のすべての書籍タイトルを借りた借り手の名前を列挙しようとします。 「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 

であると私は上記のクエリだけでなく、サブクエリ SELECT bt.BtName FROM BookTitle btに各書籍の名前をある bt.BtNameを使用する必要があると思いますが、私はドンリスト全体でこれを行うための単語やクエリはありません。

第1のテーブルと第2のクエリの各行とを比較する必要がありますが、これを行う方法はまだありません。

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

なぜあなたはクエリで 'BtName'を使う必要があると感じますか? –

+0

まあ私は 'BtName'または 'BtId'のどちらかを使うことができると思いますが、どちらも同じ結果を持つはずです。 –

+0

'BookCopy'にもタイトルの列がありますか? –

答えて

1

DISTINCTで)ユニークな借り手タイトルの組み合わせを収集した後、あなたはGROUP BYHAVINGを使用して存在booktitlesの合計数に相当booktitlesの数とそれらの借り手を特定することができます。

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) 
0

何について:

関連する問題