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

无法在简单JSON数组中查询匹配值的技术求助

解决JSON数组列匹配payID并查询用户名的问题

你的问题根源在于:用replace处理后得到的是单个字符串"123,456,789",而IN()需要的是多个独立的数值参数,MySQL会把这个字符串当成一个整体去匹配payID,自然找不到匹配结果。

下面提供两种可行的解决方法:

方法一:使用JSON_TABLE(MySQL 8.0+推荐)

这是最规范的JSON数组处理方式,能把数组拆成独立的行数据,直接关联数值类型的payID:

SELECT 
    m.*,
    (SELECT GROUP_CONCAT(u.name)
     FROM ns_accounts a
     INNER JOIN ns_users u ON u.id = a.uID
     INNER JOIN JSON_TABLE(
         m.referrals,
         '$[*]' COLUMNS(pay_id INT PATH '$')
     ) jt
     ON a.payID = jt.pay_id) AS matched_names
FROM 你的主表名称 m;

替换你的主表名称为实际存储referrals列的表名即可。JSON_TABLE会将referrals数组中的每个元素拆成单独的行,每行对应一个整数类型的pay_id,这样就能和ns_accounts的payID正确匹配。

方法二:使用FIND_IN_SET(兼容MySQL 5.7)

如果你的MySQL版本低于8.0,可以用FIND_IN_SET实现,它会自动将逗号分隔的字符串拆分为列表进行匹配:

SELECT 
    m.*,
    (SELECT GROUP_CONCAT(u.name)
     FROM ns_accounts a
     INNER JOIN ns_users u ON u.id = a.uID
     WHERE FIND_IN_SET(a.payID, JSON_UNQUOTE(m.referrals)) > 0) AS matched_names
FROM 你的主表名称 m;

注意:如果payID是整数类型,MySQL会自动进行隐式类型转换,不需要额外处理。

为什么原来的方法失效

你之前的写法相当于IN('123,456,789'),MySQL会把这个完整字符串当作一个单一值,和整数类型的payID比较时没有匹配项,因此返回null。

内容的提问来源于stack exchange,提问作者ceaiius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:39:59