You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

说明:

  1. 只保留必要的关联表:客户、租赁、库存、电影,确保数据是客户-租赁-库存-电影的对应关系。
  2. GROUP BY同时按customer_id(避免同名客户混淆)和film_id分组,这样能准确统计每个客户租每部电影的次数。
  3. HAVING子句筛选出租赁次数超过3次的记录,同时可以显示对应的电影名称和次数,让结果更清晰。
  4. 如果只需要去重后的客户列表(不需要重复显示同一客户租多部符合条件的电影),可以调整为:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:20:28