【问题标题】:SQL combine two queries into oneSQL 将两个查询合二为一
【发布时间】:2013-02-10 00:13:57
【问题描述】:

这些是我拥有的三个表格的简化版本:

Books
BookID (PK)
AuthorID
...


Purchases
PurchaseID (PK)
CustomerID
BookID
Date
...

Authors 
AuthorID (PK)
Name
...

我希望表格之间的联系是不言自明的,但我将给出一个简短的解释:作者与书籍之间以及书籍与购买之间存在一对多的关系。

现在我想从给定作者所写且已购买超过 X 次的 Books 中选择一本书。

我可以查询给定作者的书籍:

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

但我只想要那些购买次数超过 X 次的书。

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

我不知道如何完成这个查询,或者即使有可能。然后我想将它与第一个查询结合起来,如果可能的话,使用 INNER JOIN。

我愿意接受设计存在缺陷。也许购买表应该简单地将 BookID 作为 PK 并有一个购买数量的字段。

【问题讨论】:

  • 你的设计没有缺陷。如果您按照您提到的那样修改购买表。

标签: sql


【解决方案1】:
SELECT * FROM
Books INNER JOIN Purchases USING (BookID) 
WHERE AuthorID = ? 
GROUP BY BookID 
HAVING COUNT(BookID) > ?;

【讨论】:

    【解决方案2】:

    LEFT JOIN 将允许显示记录,即使他们尚未购买。 totalSold 的值为 0。

    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
    

    如需进一步了解联接,请访问以下链接:

    【讨论】:

      【解决方案3】:
      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)
      

      【讨论】:

        猜你喜欢
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多