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

WebSql中如何使用子查询统计组及其子组的关联日志总记录数

报错原因说明

你修改语句时触发的列数不匹配错误,核心是**IN 运算符要求子查询仅返回单列值用于匹配**,一旦在子查询中同时返回logId和count两列,数据库无法判断匹配逻辑,因此抛出语法错误。
结合你现有基于嵌套集(LEFT/RIGHT字段)的组层级存储逻辑,无需重写原有结构,仅需提前聚合每个日志的记录数,再按子树范围累加即可实现需求。

改造后的可运行查询

WITH logRecordCounts AS (
    -- 先按日志ID聚合,算出每个有有效记录的日志对应的总记录数
    SELECT 
        logId, 
        COUNT(*) AS recordCount 
    FROM savedLogRecords
    GROUP BY logId
),
groupDirectRecordCounts AS (
    -- 关联日志表,算出每个组直接挂载的有效日志的总记录数
    SELECT 
        l.groupId,
        SUM(lrc.recordCount) AS directRecordCount
    FROM logs l
    INNER JOIN logRecordCounts lrc 
        ON l.logId = lrc.logId
    GROUP BY l.groupId
)
SELECT 
    G.groupId,
    -- 累加当前组整棵子树范围内的所有记录数,无匹配时返回0
    COALESCE((
        SELECT SUM(gdrc.directRecordCount)
        FROM groups G2
        INNER JOIN groupDirectRecordCounts gdrc 
            ON G2.groupId = gdrc.groupId
        WHERE G2.LEFT BETWEEN G.LEFT AND G.RIGHT
    ), 0) AS totalSubtreeRecordCount
FROM groups G
WHERE 
    G.parentId = ?
    -- 保留原有过滤逻辑:仅返回子树内存在有效记录的组
    AND EXISTS (
        SELECT 1
        FROM groups G2
        INNER JOIN groupDirectRecordCounts gdrc 
            ON G2.groupId = gdrc.groupId
        WHERE G2.LEFT BETWEEN G.LEFT AND G.RIGHT
    )

逻辑匹配验证

完全匹配你给出的层级示例计算规则:

  • 传入顶级组ID时:子树覆盖组结构内所有节点,累加范围内日志X(3条)、日志Y(4条)、日志Z(5条)的记录数,结果为12
  • 传入子组B的ID时:子树仅覆盖子组B、子组C节点,累加范围内日志Y(4条)、日志Z(5条)的记录数,结果为9
  • 原查询“返回有有效记录的组ID列表”的逻辑完全保留,仅新增子树总记录数列。

内容的提问来源于stack exchange,提问作者JDuffy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 13:45:07