Sélectionnez COUNT () à partir de plusieurs bases de données dans SQL
Question
Je cherche à retourner le nombre de clients situés dans un état spécifique qui ont loué un film spécifique, où la table des loyers contient deux colonnes, une pour l'ID client et un pour l'ID de film. La fonction prend un ID de film et de l'état et retourne un entier avec la quantité de clients.
En ce moment j'ai une mise en œuvre, mais il compte le nombre de lignes de retour les entiers de la requête:
SELECT COUNT(*) as numCustomers FROM CUSTOMER C, RENTS R WHERE C.ST = '" + state + "' AND R.mid = " + movieID
Et puis je compte le nombre de lignes. Je voudrais simplement être en mesure de vérifier numCustomers pour les données correctes. Merci!
La solution
Tout d'abord, vous manquez une clause de lier votre table et votre table LOYERS CLIENT sur CustomerId?
En second lieu, vous devez utiliser la fonctionnalité INNER JOIN dans la clause FROM d'ajouter vos deux tableaux.
Troisièmement, vous ne devriez pas construire votre sql comme une chaîne comme celui-ci que vous serez ouvert à injection SQL.
Lors d'une estimation, le genre de SQL vous pouvez être après est la suivante.
DECLARE @movieId int
DECLARE @state varchar(2)
SET @movieId = 12345
SET @state = 'NY'
SELECT
COUNT(DISTINCT C.CustomerID) as numCustomers
FROM
CUSTOMER C
INNER JOIN
RENTS R
ON
C.CustomerID = R.CustomerId
WHERE
C.ST = @state
AND
R.mid = @movieId
Autres conseils
Deviner quelque chose sur votre schéma (comment LOYERS se rapporte au client):
SELECT COUNT(*) as numCustomers
FROM CUSTOMER c
WHERE
c.ST = @State
AND EXISTS
(
SELECT *
FROM RENTS r
WHERE r.CustomerID = c.CustomerID
AND r.mid = @movieID
)
En outre, vous devriez la recherche attaques par injection SQL, si vous n'êtes pas déjà familier avec ce sujet.
Vous devez vous connecter vos tables client et de location, sinon vous aurez une entrée pour chaque entrée dans chaque tableau.
Que diriez-vous:
SELECT COUNT(C.ID) AS numCustomers
FROM CUSTOMER C, RENTS R
WHERE
C.ID = R.RenterID
AND
C.ST = '" + state + "'
R.mid = " + movieID
<=>