MySQL如何通过存储为[id, anotherId]格式的字段关联对应关联表
问题原因
你当前写法不生效的核心原因是:SUBSTRING处理后返回的是单个完整字符串(例如处理["1110663703","1958153258"]后得到"1110663703","1958153258"),而IN运算符需要的是独立的多个值集合,把单个字符串作为IN的参数自然匹配不到任何id,所以返回0行。
解决方案
以下分不同数据库场景给出可直接运行的方案:
方案1:JSON函数方案(推荐,适配绝大多数主流数据库)
你存储的related_table_ids本身就是标准JSON数组格式,用数据库自带的JSON函数处理性能最高、准确性最好:
- MySQL 5.7及以上版本写法:
SELECT t.*, rt.* FROM `table` t INNER JOIN related_table rt ON JSON_CONTAINS(t.related_table_ids, JSON_QUOTE(rt.id));
- PostgreSQL写法:
SELECT t.*, rt.* FROM "table" t INNER JOIN related_table rt ON rt.id::TEXT = ANY(jsonb_array_elements_text(t.related_table_ids::jsonb));
方案2:字符串匹配兼容方案(适配所有数据库)
如果你的数据库版本过低不支持JSON函数,可以用字符串模糊匹配实现:
SELECT t.*, rt.* FROM `table` t INNER JOIN related_table rt ON t.related_table_ids LIKE CONCAT('%"', rt.id, '"%');
注意:该方案只要你的id是纯数字、无特殊重合字符,就不会出现误匹配问题。
内容的提问来源于stack exchange,提问作者Rykers
相关产品推荐
相关产品推荐

