嵌套子查询实现跨表计数的写法咨询及错误SQL修正指导
问题分析与正确写法
你的SQL存在的问题:
- 语法错误:语句中重复使用了
FROM关键字,子查询定义后直接接第二个FROM,违反SQL语法规则。 - 关联逻辑错误:子查询中引用了外部查询的
r.title_id和m.member_id,但未建立正确的关联关系;同时WHERE条件里的m.member_id = rr.title_id是错误关联,应该匹配会员ID,即rr.member_id = m.member_id。 - 缺少分组逻辑:统计借阅次数需要按
member_id和title_id分组,否则count(*)会计算所有记录的总数,无法得到每位会员每本书的单独借阅次数。
正确的嵌套子查询写法
写法一:子查询先统计,再关联会员表
这种方式先在子查询中完成借阅次数的统计,再与会员表关联获取会员信息,执行效率更高:
SELECT m.member_id, m.last_name, m.first_name, rental_stats.title_id, rental_stats.rental_count FROM member m INNER JOIN (SELECT member_id, title_id, COUNT(*) AS rental_count FROM rental GROUP BY member_id, title_id) AS rental_stats ON m.member_id = rental_stats.member_id;
写法二:关联子查询直接计算次数
通过关联子查询在SELECT语句中直接计算当前会员当前图书的借阅次数:
SELECT m.member_id, m.last_name, m.first_name, r.title_id, (SELECT COUNT(*) FROM rental rr WHERE rr.member_id = m.member_id AND rr.title_id = r.title_id) AS rental_count FROM member m INNER JOIN rental r ON m.member_id = r.member_id GROUP BY m.member_id, m.last_name, m.first_name, r.title_id;
内容的提问来源于stack exchange,提问作者Dudu Dudu
相关产品推荐
相关产品推荐

