求助:在Sakila数据库中用表式子查询获取租赁次数最多的客户
解决Sakila数据库中用子查询找出租赁次数最多的客户问题
你的原查询之所以只返回第一行客户加最大租赁次数,是因为直接使用MAX(Num_rentals)却没有按客户分组,数据库会将所有行聚合为一行,随机取一个客户信息(通常是表中第一行)并附上全局最大租赁次数,这不符合需求。
以下是满足你要求的子查询实现方式:
SELECT c.customer_id, c.first_name, c.last_name, sub.num_rentals FROM customer c JOIN ( -- 计算每个客户的租赁次数 SELECT customer_id, COUNT(*) AS num_rentals FROM rental GROUP BY customer_id ) sub ON c.customer_id = sub.customer_id -- 筛选出租赁次数等于全局最大值的客户 WHERE sub.num_rentals = ( SELECT MAX(rental_count) FROM ( -- 先拿到所有客户的租赁次数,再取最大值 SELECT COUNT(*) AS rental_count FROM rental GROUP BY customer_id ) max_counts );
这个查询的逻辑是:
- 内层子查询先统计每个客户的租赁次数;
- 嵌套子查询从这些租赁次数里找出最大值;
- 最后关联客户表和租赁次数统计结果,只保留租赁次数等于最大值的客户记录,这样即使有多个客户并列第一,也能全部返回。
内容的提问来源于stack exchange,提问作者MJMacarty
相关产品推荐
相关产品推荐

