MySQL中查询逗号分隔存储的tags字段,筛选所有标签都在传入列表内的记录
方案可行性判断
你提到的排序后判断子串的方案是可行的,但要注意两个细节避免匹配出错:
- 存储和查询时都要先对标签做统一的字典序排序,同时要保证所有标签的大小写、前后空格规则一致
- 为了避免短标签和长标签部分匹配(比如
tag1匹配到tag12),建议给存储的tags字段和传入的查询标签都首尾加上逗号,比如将tag1,tag2存为,tag1,tag2,,查询时将tag2,tag1,tag7处理为,tag1,tag2,tag7,,再用LOCATE函数判断存储的字符串是否是查询字符串的子串即可。
其他实现思路
因为你的表数据量极小,下面几个方案都可以直接用,不用改现有表结构:
1. 正则匹配方案(无需改存储逻辑,最方便)
直接用MySQL正则匹配即可实现需求,示例SQL如下:
SELECT * FROM PriceList WHERE tags REGEXP CONCAT('^((', REPLACE(?, ',', '|'), '),?)+$');
其中?位置替换为你传入的逗号分隔标签列表即可。原理是把传入的标签列表拼接成正则可选分支,要求行内tags的所有标签都属于传入的标签集合。
2. 业务层过滤方案(开发成本最低)
直接把表内所有数据先查询到业务代码中,在代码层拆分每行的tags和传入的标签列表做包含判断即可。10条以内的数据处理完全没有性能开销,还能避免SQL写错导致的匹配错误。
3. 自定义函数方案(可复用性高)
如果这类查询场景较多,可以自定义一个MySQL函数,接收两个逗号分隔的字符串参数,返回第一个字符串的所有元素是否都包含在第二个字符串中,后续查询直接调用函数即可,SQL可读性更高。
内容的提问来源于stack exchange,提问作者drenda
相关产品推荐
相关产品推荐

