0

これらは、私が持っている 3 つのテーブルの簡略化されたバージョンです。

Books
BookID (PK)
AuthorID
...


Purchases
PurchaseID (PK)
CustomerID
BookID
Date
...

Authors 
AuthorID (PK)
Name
...

テーブル間の関係が一目瞭然であることを願っていますが、簡単に説明します。著者と本の間、および本と購入の間には 1 対多の関係があります。

ここで、特定の著者によって書かれ、X 回以上購入された本から本を選択したいと考えています。

特定の著者の書籍をクエリできます。

SELECT * FROM Books where AuthorID = 'some author';

しかし、X 回以上購入された本だけが欲しいのです。

   SELECT BookID from Purchases WHERE ...(where the occurance of BookID>X)

このクエリを完了する方法がわかりません。また、それが可能かどうかもわかりません。そして、可能であれば、INNER JOIN を使用して最初のクエリと結合したいと考えています。

設計に欠陥があることを喜んで受け入れます。おそらく Purchases テーブルは、PK として BookID を持ち、購入数のフィールドを持つべきです。

4

3 に答える 3

2
SELECT * FROM
Books INNER JOIN Purchases USING (BookID) 
WHERE AuthorID = ? 
GROUP BY BookID 
HAVING COUNT(BookID) > ?;
于 2013-02-09T16:04:05.607 に答える
2

LEFT JOINまだ購入していなくてもレコードを表示できるようにします。の値はtotalSold0 になります。

SELECT  a.BookID,
        b.Name,
        COUNT(c.BookID) totalSold
FROM    Books a
        INNER JOIN Authors b
            ON a.authorID = b.AuthorID
        LEFT JOIN   Purcahses c 
            ON a.BookID = c.BookID
WHERE   b.Name = 'AuthorName'
GROUP   BY a.BookID, b.Name
HAVING  COUNT(c.BookID) >= x -- <<== where X is the number of purchase

結合についてさらに詳しく知りたい場合は、以下のリンクにアクセスしてください。

于 2013-02-09T16:01:51.763 に答える
1
SELECT b.*, a.Name as author_name
FROM Books b
INNER JOIN Authors a ON (a.AuthorId = b.AuthorId)
INNER JOIN 
(
SELECT BookID
--if you also want to include number of purchases to resultset, 
-- uncomment the line below
-- ,count(1) as cnt
from Purchases 
GROUP BY BookID
HAVING count(1) > x
)c ON (c.BookID = b.BookID)
于 2013-02-09T16:06:15.670 に答える