这个问题在google上是可见的并且有很多观点,所以我想分享我对这个问题的处理方法。我不得不处理如此糟糕的设计,因为逗号分隔的值也存储为字符串。我在调整负责标签的 CMS 插件时遇到了这个问题。
是的,与网站文章相关的标签是这样存储的:“ tag1,tag2,...,tagN ”。因此,获得精确匹配并不像最初出现的那么简单:使用 simple LIKE
,文章标记为“ ball ”,我也得到了标记为“foot ball ”和“ ball room”的文章。不重要,但很烦人。
FIND_IN_SET函数起初看起来很棒,但后来发现它不使用索引并且如果第一个参数包含逗号字符则无法正常工作。
我不想改变插件本身或构建该插件的更深层次的 CMS 核心功能。
另外值得注意的是,需要的标记(子字符串)可以是字符串中的第一个、最后一个元素,也可以位于中间的某个位置,因此这段代码WHERE (',' + Categories + ',') LIKE '%,science,%'
并未涵盖所有三种情况。
最后,我得到了非常简单的解决方案。它对我有用:
... WHERE tags LIKE 'ball,%' OR tags LIKE '%,ball,%' OR tags LIKE '%,ball'
涵盖所有情况;逗号用作分隔符。希望它可以帮助遇到类似陷阱的其他人。
PS。我根本不是 MySQL/DB 专家,我很想了解这种方法的潜在缺点,尤其是在非常大的表上(这不是我的情况,顺便说一句)。我只是分享了我的小型研究的结果,以及我为解决这个问题所做的努力。