FROM
最初のクエリに句がありません。することもできますがCOUNT(*)
、この場合は特に重要ではありません。
SELECT count(Book.bookId) FROM Books WHERE BookName = "Fundamentals of calculus";
どの図書館に特定の本があるかを見つけるために、COUNT()
集合体は必要ありません。WHERE
代わりに、結合を含む句が必要です。は、本を持っている図書館の数COUNT()
を教えてくれますが、どの図書館を持っているかはわかりません。そのためには、を返すクエリが必要ですLibraries.Name
。
SELECT
/* Return library names */
Libraries.Name
FROM
Libraries
/* Join through your lookup table to match a book name to a library name */
JOIN Lib_Book_LookUp ON Libraries.ID = Lib_Book_LookUp.libId
JOIN Books ON Books.ID = Lib_Book_LookUp.bookId
/* Which book to search for */
WHERE Books.BookName = 'Fundamentals of calculus'
Books
ルックアップテーブルは、複数のライブラリに存在する場合に、ブックをテーブル内の1つのレコードに正規化できるため適切です。Books
あなたがそれを持っているので、テーブルに複数のコピーを持っている本当の理由はありません、そしてBook ID
列の理由もありません。実際、このBook ID
コラムはそのままではかなり誤解を招く恐れがあります。同じIDを持つ2つの異なるタイトルの本があります1
。
表は実際には次のようになります。Books
本のタイトルごとに1つのレコードがあります(タイトルを権限として想定し、ISBNのような実際の権威あるものを忘れています)
Books
ID BookName
1 Fundamentals of calculus
2 Mechanics
3 Biology
各図書館で各本の複数のコピーが可能な場合は、1部あたりの本を、図書館のバーコードで識別するテーブルに正規化することを検討してください。次に、それらのIDを所蔵としてライブラリに一致させます。
Books (defines bibliographic details)
ID BookName
1 Fundamentals of calculus
2 Mechanics
3 Biology
Book_Copies (Matches Books.ID to barcode, barcode is Primary Key)
BookId Barcode
1 1234567
1 1234568
2 8654321
2 8654322
Lib_Book_LookUp (matches book copies to libraries, allowing multiple copies by barcode)
ID libId bookBarcode
1 1 1234567
2 1 1234568
3 2 8654321
4 2 8654322
たとえば、ライブラリごとの本ごとの部数を照会するには、次を使用します。
SELECT
Libraries.Name,
Books.BookName,
COUNT(*)
FROM
Libraries
JOIN Lib_Book_LookUp ON Libraries.ID = Lib_Book_LookUp.libId
JOIN Book_Copies ON Lib_Book_Lookup.bookBarcode = Book_Copies.Barcode
JOIN Books ON Book_Copies.BookId = Books.ID
GROUP BY
Libraries.Name,
Books.BookName