从SQL中的多个数据库中选择COUNT()

时间:2009-03-23 19:39:23

标签: sql select count aggregate

我正在尝试返回位于特定状态下已租借特定影片的客户数量,其中租借表包含两列,一列用于客户ID,另一列用于电影ID。该函数接受电影ID和状态,并返回一个包含客户数量的整数。

现在我有一个实现,但它会计算整个查询返回的行数:

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

然后我计算行数。我想能够检查numCustomers的正确数据。谢谢!

3 个答案:

答案 0 :(得分:8)

首先,您缺少一个链接您的RENTS表和CustomerId上的CUSTOMER表的子句?

其次,您应该使用FROM子句中的INNER JOIN功能添加两个表。

第三,你不应该将你的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 :(得分:1)

猜测您的架构(RENTS与CUSTOMER的关系):

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注入攻击。

答案 2 :(得分:0)

您必须连接您的客户和租赁表,否则您将获得每个表中每个条目的条目。

怎么样: SELECT COUNT(C.ID) AS numCustomers FROM CUSTOMER C, RENTS R WHERE C.ID = R.RenterID AND C.ST = '" + state + "' AND R.mid = " + movieID