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

关联两张用户表时避免用户名重复,求正确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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:18:13