Выберите COUNT() из нескольких баз данных в SQL
Вопрос
Я пытаюсь вернуть количество клиентов, расположенных в определенном штате, которые арендовали определенный фильм, где таблица rents содержит два столбца, один для идентификатора клиента и один для идентификатора фильма.Функция принимает идентификатор фильма и состояние и возвращает целое число с количеством клиентов.
Прямо сейчас у меня есть реализация, но она подсчитывает количество строк, возвращаемых всем запросом:
SELECT COUNT(*) as numCustomers FROM CUSTOMER C, RENTS R WHERE C.ST = '" + state + "' AND R.mid = " + movieID
А затем я подсчитываю количество строк.Я хотел бы просто иметь возможность проверять numCustomers на наличие правильных данных.Спасибо!
Решение
Во-первых, вам не хватает предложения, связывающего вашу таблицу RENTS и вашу таблицу CUSTOMER в CustomerID?
Во-вторых, вы должны использовать функцию ВНУТРЕННЕГО СОЕДИНЕНИЯ в предложении FROM, чтобы добавить ваши две таблицы.
В-третьих, вам НЕ следует создавать свой sql в виде строки, подобной этой, поскольку вы будете открыты для SQL-инъекции.
На первый взгляд, тип SQL, который вам может понадобиться, выглядит следующим образом.
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
Другие советы
Предположение о вашей схеме (как АРЕНДНАЯ плата соотносится с КЛИЕНТОМ):
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
)
Кроме того, вам следует исследовать атаки с использованием SQL-инъекций, если вы еще не знакомы с этим предметом.
Вы должны соединить свои таблицы Customer и Rental, в противном случае вы получите запись для каждой записи в каждой таблице.
Как насчет:SELECT COUNT(C.ID) AS numCustomers
FROM CUSTOMER C, RENTS R
WHERE
C.ID = R.RenterID
AND
C.ST = '" + state + "'
AND
R.mid = " + movieID