在 HAVING 子句中子查询 returns 多行

Subquery returns multiple rows in HAVING clause

我想获取2016年7月借用类别3影片最多的客户

SELECT c_firstName, c_lastName, rental.c_ID
FROM customer, rental
GROUP BY rental.c_ID HAVING rental.c_ID=MAX((SELECT COUNT(rental.c_ID) 
FROM customer, copies, rentalprocess, rental, film
WHERE customer.c_ID=rental.c_ID AND rentalprocess.r_ID=rental.r_ID AND
      rentalprocess.s_ID=copies.s_ID AND film.f_ID=copies.f_ID AND
      f_category=3 AND r_date LIKE "2016-07%" GROUP BY rental.c_ID))

但是ir不起作用,因为它说子查询returns不止一行

我能做什么?

Max()是聚合函数,需要在select语句中

SELECT 
  c_firstName
  , c_lastName
  , rental.c_ID
FROM customer, rental
GROUP BY rental.c_ID 
HAVING rental.c_ID=
  (
  select 
    MAX(i.iID) 
  from 
    (
    SELECT 
      COUNT(rental.c_ID) iID
    FROM customer, copies, rentalprocess, rental, film
    WHERE 
      customer.c_ID=rental.c_ID AND 
      rentalprocess.r_ID=rental.r_ID AND
      rentalprocess.s_ID=copies.s_ID AND 
      film.f_ID=copies.f_ID AND
      f_category=3 
      AND r_date LIKE "2016-07%" 
    GROUP BY rental.c_ID
    ) i
  )

在这种情况下,sub-select returns 多行,然后你取该查询的最大值

Linoff 先生的评论是正确的,您应该使用显式连接:

SELECT 
  c_firstName
  , c_lastName
  , rental.c_ID
FROM customer, rental
GROUP BY rental.c_ID 
HAVING rental.c_ID=
  (
  select 
    MAX(i.iID) 
  from 
    (
    SELECT 
      COUNT(rental.c_ID) iID
    FROM 
      customer 
      inner join rental 
        on customer.c_ID=rental.c_ID
      inner join rentalprocess 
        on rentalprocess.r_ID=rental.r_ID
      inner join copies 
        on rentalprocess.s_ID=copies.s_ID
      inner join film on film.f_ID=copies.f_ID
    WHERE 
      f_category=3 
      AND r_date LIKE "2016-07%" 
    GROUP BY rental.c_ID
    ) i
  )

您的代码应如下所示,在代码中正确加入 table。 我不知道哪个列和 table 最适合该解决方案,因为我没有您的完整架构。但这应该提供更快的查询。如果需要,请在 select 中添加更多列。

select c_firstName | ' ' | c_lastName, count(rental.c_ID) as rentalCustomer
    from customer
     inner join rental
       on join " connect the both tables"
      innner join rentalprocess
       on "connect rental with rentalprocess"
      inner join copies
         on " connect rentalprocess with copies"
       inner join film
        on "connect copies with film"
    WHERE customer.c_ID=rental.c_ID AND 
    rentalprocess.r_ID=rental.r_ID AND
      rentalprocess.s_ID=copies.s_ID AND 
    film.f_ID=copies.f_ID AND
      f_category=3 AND r_date LIKE "2016-07%"
     group by c_firstName, c_lastName, rental.c_ID
    order by rental.c_ID desc;