Pregunta

Estoy intentando devolver el número de clientes que se encuentren en un estado específico que han alquilado una película específica, donde la mesa rentas contiene dos columnas, una para ID de cliente y otro para el ID de película. La función toma en una ID de la película y el estado y devuelve un número entero con la cantidad de clientes.

Ahora mismo tengo una implementación, pero cuenta la cantidad de filas enteras devuelve la consulta:

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

Y luego contar la cantidad de filas. Me gustaría simplemente ser capaz de verificar numCustomers para los datos correctos. Gracias!

¿Fue útil?

Solución

En primer lugar, se carece de una cláusula de enlazar su mesa de rentas y su mesa de atención al cliente en CustomerId?

En segundo lugar, se debe utilizar la funcionalidad INNER JOIN en la cláusula FROM de añadir sus dos tablas.

En tercer lugar, usted no debe construir su sql como una cadena como esta ya que estará abierto a la inyección de SQL.

En una conjetura, el tipo de SQL que puede ser después es como sigue.

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

Otros consejos

El conjeturar algo acerca de su esquema (RENTAS cómo se relaciona con CLIENTE):

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
    )

Además, usted debe investigar los ataques de inyección SQL, si no está ya familiarizado con el tema.

Usted tiene que conectar su cliente y mesas alquiler de lo contrario obtendrá una entrada para cada entrada en cada tabla.

¿Qué hay de: SELECT COUNT(C.ID) AS numCustomers FROM CUSTOMER C, RENTS R WHERE C.ID = R.RenterID AND C.ST = '" + state + "' R.mid = " + movieID <=>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top