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

如何用原生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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 05:54:01