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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:54