关联两张用户表时避免用户名重复,求正确SQL查询语句
解决用户表与学历详情表关联后的聚合问题
嘿,我来帮你搞定这个需求!你现在遇到的是关联Users和details表后,同一用户的多条学历记录重复输出的问题,想要把每个用户的所有学历信息收拢成嵌套的结构化结果,这个在MySQL里可以通过分组聚合结合JSON函数轻松实现,下面给你两种可行的方案:
方案一:用JSON_ARRAYAGG直接生成嵌套数组(MySQL 5.7+推荐)
这个方法最简洁,直接利用MySQL的JSON聚合函数生成你想要的结构:
SELECT u.username AS name, JSON_ARRAYAGG( JSON_OBJECT( 'degree', d.degree, 'degree_name', d.degree_name ) ) AS details FROM Users u INNER JOIN details d ON u.id = d.user_id GROUP BY u.id, u.username;
逻辑说明:
INNER JOIN用来关联两张表,通过用户的id和详情表的user_id匹配关联记录JSON_OBJECT把每条学历的两个字段打包成一个JSON对象,对应你期望里的单个详情项JSON_ARRAYAGG会把同一用户的所有JSON对象聚合成一个数组,正好是你要的details结构GROUP BY按用户ID和用户名分组,保证每个用户只出一行结果
方案二:结合GROUP_CONCAT和FIND_IN_SET(兼容低版本MySQL)
如果你提到的find_in_set()是需要处理字符串形式的聚合结果,那可以用这个方法先把详情拼接成JSON格式的字符串:
SELECT u.username AS name, CONCAT('[', GROUP_CONCAT( JSON_OBJECT( 'degree', d.degree, 'degree_name', d.degree_name ) SEPARATOR ',' ), ']') AS details FROM Users u INNER JOIN details d ON u.id = d.user_id GROUP BY u.id, u.username;
逻辑说明:
GROUP_CONCAT把同一用户的所有JSON对象字符串用逗号连起来- 前后加上
[和],凑成完整的JSON数组格式 - 如果后续需要用
FIND_IN_SET来查找某个学历相关的内容,可以基于这个字符串进行操作(不过还是更推荐用第一种方案的原生JSON类型,操作更灵活)
最终效果
执行上面的查询后,得到的结果结构和你期望的完全一致,比如john doe的details会是一个包含3个对象的JSON数组,每个对象对应一条学历记录。
内容的提问来源于stack exchange,提问作者ahmad ashfaq
相关产品推荐
相关产品推荐

