Вопрос

Я пытаюсь вернуть количество клиентов, расположенных в определенном штате, которые арендовали определенный фильм, где таблица 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top