如何使用逗号分隔字符串作为MySQL搜索查询匹配规范化数据库标签
问题根因
你之前使用FIND_IN_SET未生效的核心原因是传入的逗号分隔字符串中,逗号后带有空格,FIND_IN_SET会将空格识别为值的一部分:比如"T18, T5"会被拆分为"T18"和" T5",和库中无空格的T5无法匹配。该场景完全可以用FIND_IN_SET实现需求,不需要动态拼接IN子句。
解决方案
方案1:匹配任意传入标签(等价于你需求的IN子句效果)
用REPLACE函数先把入参里的所有空格清除,再传给FIND_IN_SET即可:
SELECT DISTINCT RE.R_Name FROM Demo_Tag DT INNER JOIN Responsibility RE ON RE.R_id = DT.R_id WHERE FIND_IN_SET(DT.Tag_id, REPLACE("T18, T5", ' ', '')) <> 0;
替换"T18, T5"为你实际的入参字符串即可,效果完全等价于DT.Tag_id IN ("T18","T5")。
方案2:匹配所有传入标签(扩展场景,可选)
如果你需要查询同时包含所有传入标签的记录(比如入参是T5,T6,要找同时绑定这两个标签的R_id),可以追加分组统计条件:
SELECT DISTINCT RE.R_Name FROM Demo_Tag DT INNER JOIN Responsibility RE ON RE.R_id = DT.R_id WHERE FIND_IN_SET(DT.Tag_id, REPLACE("T5, T6", ' ', '')) <> 0 GROUP BY DT.R_id, RE.R_Name -- 数值等于传入的标签总数量 HAVING COUNT(DISTINCT DT.Tag_id) = 2;
内容的提问来源于stack exchange,提问作者Brendon
相关产品推荐
相关产品推荐

