2013-02-09 4 views
0

Ce sont des versions simplifiées de trois tables je:SQL combiner deux requêtes en une seule

Books 
BookID (PK) 
AuthorID 
... 


Purchases 
PurchaseID (PK) 
CustomerID 
BookID 
Date 
... 

Authors 
AuthorID (PK) 
Name 
... 

J'espère que la connexion entre les tables est explicite, mais je vais donner une brève explication: Il y a une relation de un à plusieurs entre les auteurs et les livres et entre les livres et les achats.

Maintenant je veux sélectionner un livre parmi les livres qui sont écrits par un auteur donné et qui ont été achetés plus de X fois.

Je peux interroger les livres pour un auteur donné:

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

Mais je veux que les livres qui ont été achetés plus de X fois.

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

Je ne sais pas comment compléter cette requête, ou même si c'est possible. Et puis je veux le combiner avec la première requête, en utilisant un INNER JOIN, si possible.

Je suis prêt à accepter que la conception est défectueuse. Peut-être que la table des achats devrait simplement avoir BookIDs comme PK et avoir un champ pour le nombre d'achats.

+0

Votre conception est pas vicié. Ce serait si vous avez modifié la table des achats comme vous l'avez mentionné. –

Répondre

2
SELECT * FROM 
Books INNER JOIN Purchases USING (BookID) 
WHERE AuthorID = ? 
GROUP BY BookID 
HAVING COUNT(BookID) > ?; 
2

LEFT JOIN permet d'afficher les enregistrements même s'ils n'ont pas encore été achetés. La valeur de totalSold sera 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 

Pour gagner encore plus de connaissances sur les jointures, veuillez visiter le lien ci-dessous:

+1

+1 pour le lien grand article – 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)