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

请求按反应类型分组的SQL原生查询及ORM关联修正

正确的原生SQL查询(获取帖子及按反应类型分组的统计数据)

由于你的ORM关联配置错误(@hasMany关联了错误的模型,且外键设置不符合表结构),直接使用preload无法得到期望的结构化数据。以下是针对不同数据库的原生SQL解决方案:

PostgreSQL版本

SELECT
    p.id,
    p.post,
    COALESCE(
        json_agg(
            json_build_object(
                'reaction', r.reaction,
                'total_count', r.total_count
            )
        ) FILTER (WHERE r.reaction IS NOT NULL),
        '[]'::json
    ) AS reactions
FROM posts p
LEFT JOIN (
    -- 先按帖子ID和反应类型分组统计总数
    SELECT
        post_id,
        reaction,
        COUNT(*) AS total_count
    FROM reactions
    GROUP BY post_id, reaction
) r ON p.id = r.post_id
GROUP BY p.id, p.post;

MySQL版本

SELECT
    p.id,
    p.post,
    COALESCE(
        JSON_ARRAYAGG(
            JSON_OBJECT(
                'reaction', r.reaction,
                'total_count', r.total_count
            )
        ),
        '[]'
    ) AS reactions
FROM posts p
LEFT JOIN (
    -- 先按帖子ID和反应类型分组统计总数
    SELECT
        post_id,
        reaction,
        COUNT(*) AS total_count
    FROM reactions
    GROUP BY post_id, reaction
) r ON p.id = r.post_id
GROUP BY p.id, p.post;

说明

  1. 子查询先对reactions表按post_id和reaction分组,统计每种反应的总数
  2. 主查询通过LEFT JOIN关联帖子表,确保即使没有任何反应的帖子也会被返回
  3. 使用JSON聚合函数将每个帖子的反应统计结果组装成数组,COALESCE处理无反应的情况,返回空数组[]
  4. 查询结果的结构完全匹配你期望的格式:每个帖子对象包含id、post字段,以及reactions数组(数组元素为反应类型和对应总数)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:45:38