MySQL分组表问题:创建租客访问次数视图遇子查询多行返回错误
解决SQL视图创建:租客姓名与访问次数查询问题
嘿,我来帮你搞定这个SQL问题!咱们先拆解下你遇到的两个问题:
第一个写法报错的原因
你原来的SQL里,这个子查询:
(SELECT COUNT(renter_id) FROM transactions GROUP BY renter_id )
是一个不相关子查询,它会返回所有租客的访问次数结果(每一行对应一个租客的计数),但主查询里把它当作单个列值来用,数据库自然会报错“subquery returns more than 1 row”——毕竟一个列不能同时放多个值嘛!
而且这个子查询没有和主查询的renters.renter_id做关联,数据库根本不知道这个计数对应哪个租客。
第二个写法只拿到ID的原因
你提到第二种写法只能得到租客ID和访问次数,大概率是因为你只对transactions表做了分组查询,没有和renters表做关联,自然拿不到姓名信息。
正确的解决方案
这里给你两种靠谱的写法,都能实现“查看访问次数大于2的租客姓名及访问次数”的需求:
方法一:使用JOIN关联分组结果(推荐)
先在子查询里算出符合条件的租客ID和访问次数,再和renters表关联获取姓名:
SELECT r.first_name, r.last_name, t.visited AS visited FROM renters r INNER JOIN ( -- 子查询:计算每个租客的访问次数,筛选出次数>2的 SELECT renter_id, COUNT(*) AS visited FROM transactions GROUP BY renter_id HAVING COUNT(*) > 2 ) t ON r.renter_id = t.renter_id;
方法二:使用相关子查询
通过关联主查询的renter_id,让子查询只返回当前租客的访问次数,同时用EXISTS筛选符合条件的租客:
SELECT first_name, last_name, -- 相关子查询:只统计当前租客的访问次数 (SELECT COUNT(*) FROM transactions t WHERE t.renter_id = r.renter_id) AS visited FROM renters r WHERE EXISTS ( -- 筛选访问次数>2的租客 SELECT 1 FROM transactions t WHERE t.renter_id = r.renter_id GROUP BY t.renter_id HAVING COUNT(*) > 2 );
如果要把这个查询创建成视图,只需要在前面加上CREATE VIEW renter_visit_stats AS就行啦!
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

