Выберите COUNT () из нескольких баз данных в SQL - PullRequest
3 голосов
/ 23 марта 2009

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

Сейчас у меня есть реализация, но она подсчитывает количество строк, которое возвращает весь запрос:

SELECT COUNT(*) as numCustomers FROM CUSTOMER C, RENTS R WHERE C.ST = '" + state + "' AND R.mid = " + movieID

А потом я считаю количество строк. Я хотел бы просто иметь возможность проверить правильность данных в numCustomers. Спасибо!

Ответы [ 3 ]

8 голосов
/ 23 марта 2009

Во-первых, у вас нет пункта, связывающего вашу таблицу RENTS и таблицу CUSTOMER с CustomerId?

Во-вторых, вы должны использовать функцию INNER JOIN в предложении 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
1 голос
/ 23 марта 2009

Угадайте что-нибудь о вашей схеме (как RENTS относится к ЗАКАЗЧИКУ):

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-инъекций, если вы еще не знакомы с этой темой.

0 голосов
/ 23 марта 2009

Вы должны соединить свои таблицы 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

...