Frage

Ich bin versucht, die Zahl der Kunden in einem bestimmten Zustand befindet zurückzukehren, die einen bestimmten Film ausgeliehen haben, wo die Mieten Tabelle zwei Spalten enthält, eine für Kunden-ID und eine für den Film-ID. Die Funktion nimmt in einer Film-ID und dem Zustand und gibt eine ganze Zahl mit der Menge der Kunden.

Im Moment habe ich eine Implementierung, aber es zählt die gesamte Abfrage gibt die Anzahl der Zeilen nach oben:

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

Und dann zähle ich die Anzahl der Zeilen. Ich möchte nur in der Lage sein numCustomers für die korrekten Daten zu überprüfen. Dank!

War es hilfreich?

Lösung

Zum einen fehlt Ihnen eine Klausel Ihre RENTS Tisch und Ihre CUSTOMER-Tabelle auf CustomerId verlinken?

Zweitens sollten Sie die INNER JOIN-Funktionalität in der FROM-Klausel verwenden, um Ihre beiden Tabellen hinzuzufügen.

Drittens sollten Sie nicht Ihre SQL als Zeichenfolge wie folgt bauen, wie Sie SQL-Injection geöffnet sein wird.

Bei einer Vermutung, die Art von SQL können Sie nachdem es wie folgt aus.

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

Andere Tipps

Erraten etwas über Ihr Schema (wie RENTS auf CUSTOMER bezieht):

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
    )

Außerdem sollten Sie SQL-Injection-Angriffe erforschen, wenn Sie mit diesem Thema nicht vertraut sind.

Sie haben Ihre Kunden und Vermietung Tabellen verbinden sonst werden Sie einen Eintrag für jeden Eintrag in jeder Tabelle bekommen.

Wie wäre es: SELECT COUNT(C.ID) AS numCustomers FROM CUSTOMER C, RENTS R WHERE C.ID = R.RenterID AND C.ST = '" + state + "' AND R.mid = " + movieID

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top