【问题标题】:Sakila db SQL find customers who have rented >10 horror moviesSakila db SQL 查找租借>10部恐怖片的客户
【发布时间】:2013-03-05 20:31:05
【问题描述】:

我完全专注于我的家庭作业。我正在使用 Sakila 示例数据库。我应该写一个查询,它会给我一个所有租借了超过 10 部恐怖电影的客户的列表。这是我目前所拥有的:

select CONCAT(c.first_name, " ", c.last_name) AS "Customer name", 
FROM customer AS c

INNER JOIN rental AS r
ON c.customer_id = r.customer_id

inner join  inventory as i
on i.inventory_id = r.inventory_id

inner join  film_category as fc
on i.film_id = fc.film_id
 inner join 
(select * from category as ca
where ca.name = 'horror') as h
 on h.category_id = fc.category_id 
 ;

我可以得到它返回所有(846)个租了恐怖片的客户,但是我如何只得到那些租了10部以上恐怖片的客户呢?我知道我需要 COUNT 函数,但是当我把它放进去时,它给了我 1 个人,计数为 846,这是一个人数,而不是租借的恐怖电影。在这一点上,我的逻辑只是让我失望。请帮忙!

【问题讨论】:

  • 除了COUNT,您还需要使用GROUP BY,这样您就可以按客户和HAVING 分离结果,以便只获得具有>10 的结果
  • @darkajax - 请不要添加作业标签,此标签已过时,正在被删除。有关更多信息,请参阅 Meta 上的this 问题。
  • @Mike 知道了,抱歉不会再这样做了...

标签: mysql


【解决方案1】:

很遗憾,我不知道有问题的示例数据库,但我认为这不会影响我的回答。

如果您想使用 COUNT,您还需要使用 GROUP BY 来实现聚合计数。

您还可以查看带有HAVING 子句的GOUP BY

【讨论】:

    【解决方案2】:

    如果有人需要便餐:

    SELECT R.customer_id, COUNT(*) AS cnt 
    FROM sakila.rental R LEFT JOIN sakila.inventory I ON R.inventory_id = I.inventory_id 
    LEFT JOIN sakila.film F ON I.film_id = F.film_id 
    LEFT JOIN sakila.film_category FC on F.film_id = FC.film_id 
    LEFT JOIN sakila.category C ON FC.category_id = C.category_id 
    WHERE C.name = "Horror" 
    GROUP BY R.customer_id HAVING cnt > 10
    

    【讨论】:

      【解决方案3】:

      您也可以编写没有左连接/内连接的查询。请注意,没有任何客户拥有超过 10 次恐怖片出租,因此空白结果不会让您感到困惑(尝试 2 次即可!)

      SELECT cu.first_name, cu.last_name, COUNT(r.rental_id) as horror_film_count
      FROM customer AS cu, rental AS r, inventory as i, film as f, category as ca, 
      film_category as fc
      WHERE cu.customer_id = r.customer_id 
      AND r.inventory_id = i.inventory_id
      AND i.film_id = f.film_id
      AND f.film_id = fc.film_id
      AND fc.category_id = ca.category_id
      AND ca.category_id = 11
      GROUP BY cu.customer_id
      HAVING horror_film_count > 10
      

      【讨论】:

        猜你喜欢
        • 2016-07-22
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多