2013-02-09 4 views
0

Эти упрощенные версии трех таблиц у меня есть:SQL объединить два запроса в один

Books 
BookID (PK) 
AuthorID 
... 


Purchases 
PurchaseID (PK) 
CustomerID 
BookID 
Date 
... 

Authors 
AuthorID (PK) 
Name 
... 

Я надеюсь, что связь между таблицами сам за себя, но я дам краткое объяснение: Eсть от одного до многих отношений между авторами и книгами, а также между книгами и покупками.

Теперь я хочу выбрать книгу из книг, написанных автором и купленных более X раз.

Я могу запросить книги для данного автора:

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

Но я хочу только те книги, которые были куплены более чем Х раз.

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

Я не знаю, как выполнить этот запрос, или даже если это возможно. И затем я хочу объединить его с первым запросом, используя INNER JOIN, если это возможно.

Я согласен с тем, что дизайн испорчен. Возможно, таблица «Покупки» должна просто иметь BookIDs как PK и иметь поле для количества покупок.

+0

Ваша конструкция не испорчен. Было бы, если бы вы изменили таблицу покупок, как вы упомянули. –

ответ

2
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 

Для дальнейшего получить больше знаний о присоединяется, любезно перейдите по ссылке ниже:

+1

+1 для отличной ссылки на статью – Gigi

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) 
Смежные вопросы