如何用原生SQL实现Django多对多字段关联ID数组查询效果
问题分析与调整方案
核心错误原因
你当前SQL返回重复分类条目的根本原因是GROUP BY子句中加入了b.sport_id字段,分组维度被细化为「分类ID+运动ID」的组合,每个不同的运动ID都会生成单独的分组记录,自然会出现同一分类拆分多条的问题。
PostgreSQL 环境修正语句(当前使用array_agg默认是PostgreSQL环境)
SELECT a.*, ARRAY_AGG(b.sport_id) AS sport FROM category a JOIN category_sport b ON b.category_id = a.id GROUP BY a.id;
说明:
移除GROUP BY中的b.sport_id后,分组维度仅为分类表主键a.id,同一个分类下关联的所有运动ID都会被ARRAY_AGG聚合成单个数组,每个分类仅返回一条记录,和Django ORM序列化结果完全一致。
如果需要保留没有关联任何运动的分类记录,可以将JOIN改为LEFT JOIN,无关联的分类sport字段会返回NULL,可根据业务需求自行转换为空数组。
MySQL 环境适配语句
MySQL没有内置ARRAY_AGG函数,可改用GROUP_CONCAT拼接ID,后续在业务代码中将字符串拆分为数组即可:
SELECT a.*, GROUP_CONCAT(b.sport_id SEPARATOR ',') AS sport FROM category a JOIN category_sport b ON b.category_id = a.id GROUP BY a.id;
内容的提问来源于stack exchange,提问作者mng back
相关产品推荐
相关产品推荐

