Sakila db SQL 查找租借>10部恐怖片的客户
Posted
技术标签:
【中文标题】Sakila db SQL 查找租借>10部恐怖片的客户【英文标题】:Sakila db SQL find customers who have rented >10 horror movies 【发布时间】: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 知道了,抱歉不会再这样做了...
【参考方案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
【讨论】:
以上是关于Sakila db SQL 查找租借>10部恐怖片的客户的主要内容,如果未能解决你的问题,请参考以下文章