Sakila数据库SQL需求:查询租同一部电影超3次的客户
解决Sakila数据库查询问题:找出租同一部电影超过3次的客户
你的原查询存在几个关键问题:
- 不必要关联了
film_category和category表,这两个表和“租同一部电影次数”的需求无关,反而可能因为电影多类别导致计数重复。 - WHERE子句里的
name = ''和rental_id > 3都是错误条件,前者指向类别名称但完全不需要,后者不能用来筛选租赁次数。 - GROUP BY仅按客户名称分组无法统计“同一部电影”的租赁次数,必须同时按客户和电影分组。
正确的SQL查询语句如下:
SELECT CONCAT(c.first_name, ' ', c.last_name) AS Customer_name, f.title AS Rented_Film, COUNT(r.rental_id) AS Rental_Count FROM customer c INNER JOIN rental r ON r.customer_id = c.customer_id INNER JOIN inventory i ON i.inventory_id = r.inventory_id INNER JOIN film f ON f.film_id = i.film_id GROUP BY c.customer_id, f.film_id, Customer_name, f.title HAVING COUNT(r.rental_id) > 3 ORDER BY Customer_name, Rental_Count DESC;
说明:
- 只保留必要的关联表:客户、租赁、库存、电影,确保数据是客户-租赁-库存-电影的对应关系。
- GROUP BY同时按
customer_id(避免同名客户混淆)和film_id分组,这样能准确统计每个客户租每部电影的次数。 - HAVING子句筛选出租赁次数超过3次的记录,同时可以显示对应的电影名称和次数,让结果更清晰。
- 如果只需要去重后的客户列表(不需要重复显示同一客户租多部符合条件的电影),可以调整为:
SELECT DISTINCT CONCAT(c.first_name, ' ', c.last_name) AS Customer_name FROM customer c INNER JOIN rental r ON r.customer_id = c.customer_id INNER JOIN inventory i ON i.inventory_id = r.inventory_id INNER JOIN film f ON f.film_id = i.film_id GROUP BY c.customer_id, f.film_id, Customer_name HAVING COUNT(r.rental_id) > 3 ORDER BY Customer_name;
内容的提问来源于stack exchange,提问作者Vasco Reis
相关产品推荐
相关产品推荐

