MySQL 5.7中如何查询JSON列包含指定user_id的所有团队记录
解决方案:查询MySQL 5.7中JSON数组包含指定ID的团队
针对你的需求,在MySQL 5.7里可以借助内置的JSON函数轻松实现,直接上可行的查询语句,再给你拆解细节:
基础查询:获取所有符合条件的团队数据
如果只是要获取所有包含用户ID 26的团队记录,用JSON_CONTAINS函数就可以搞定:
SELECT * FROM teams WHERE JSON_CONTAINS(aMembers->'$.user_id', CAST(26 AS JSON));
语句细节解释:
aMembers->'$.user_id':通过JSON路径表达式,精准提取出aMembers列中存储用户ID的数组(也就是示例里[18, 55, 81, 26, 65]这部分内容)。CAST(26 AS JSON):把用户ID转换成JSON数字类型,确保和数组里的元素类型完全匹配——如果直接传字符串'26',可能会因为类型不一致导致匹配失败,这一步很关键。JSON_CONTAINS:检查提取出的数组是否包含指定的JSON值,返回1表示存在,0表示不存在,以此作为筛选条件。
生成你期望的JSON格式结果
如果你需要直接得到示例中那种以团队名为键、团队详情为值的JSON结构,可以用JSON_OBJECTAGG函数(注意:这个函数从MySQL 5.7.22版本开始支持):
SELECT JSON_OBJECTAGG(name, JSON_OBJECT( 'name', name, 'description', description, 'created_at', created_at, 'updated_at', updated_at )) AS team_data FROM teams WHERE JSON_CONTAINS(aMembers->'$.user_id', CAST(26 AS JSON));
语句细节解释:
JSON_OBJECT(...):把每个团队的name、description等字段组装成一个独立的JSON对象,比如{"name": "Team1", "description": "Team1 Description", ...}。JSON_OBJECTAGG(name, ...):将所有团队的JSON对象聚合起来,以团队的name作为键,最终生成你需要的大JSON结构。
如果你的MySQL 5.7版本低于5.7.22,JSON_OBJECTAGG不支持,建议先执行基础查询获取所有符合条件的团队数据,再在应用代码里组装成期望的JSON格式,这样更稳妥。
内容的提问来源于stack exchange,提问作者Lato




