含REPLACE的WHERE IN语句查询管道分隔tariff_id仅返回首条问题
问题根因
原有写法不生效是因为REPLACE(provision.tariff_id, '|', ',')返回的是单个字符串值,例如'1272,1312,1314',而IN运算符要求传入多个独立值,MySQL执行时会自动把整个字符串转为数值类型,仅会取第一个数字部分,所以只能匹配到第一个tariff_id。
正确实现方案
无需修改表结构或业务逻辑,直接替换子查询的匹配条件为FIND_IN_SET函数即可,该函数兼容所有主流老旧MySQL版本:
SELECT provision.id, provision.tariff_id, tariff.id, ( SELECT GROUP_CONCAT(tariff_name) FROM tariff WHERE FIND_IN_SET(tariff_id, REPLACE(provision.tariff_id, '|', ',')) > 0 ) AS tn FROM provision LEFT JOIN tariff ON tariff.id = provision.tariff_id
补充说明:原查询中的
LEFT JOIN tariff ON tariff.id = provision.tariff_id逻辑仅能关联到provision存储的第一个tariff_id对应的tariff数据,如果你不需要这部分关联结果可以直接删除这段JOIN语句。
内容的提问来源于stack exchange,提问作者Sirko.uhl
相关产品推荐
相关产品推荐

