我尝试使用三种不同的MYSQL查询来搜索单个列(类列表);目标是该列应包含_10_
,但不应包含_3_
或_15_
(示例值可能类似于_4_8_10_15_
,如果给出_15_
则可能失败)。
我尝试了三种不同的方法,所有这三种方法均未给出错误,但结果却有所不同:
1)FULLTEXT搜索(在classlist上启用了FULLTEXT索引)没有返回错误,也没有返回结果。SELECT classlist, classcount FROM subgroupstest WHERE MATCH (classlist) AGAINST ('+10 -3 -15' IN BOOLEAN MODE)
2)简单的LIKE子句返回516行。SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE "%_10_%" AND classlist NOT LIKE "%_3_%" AND classlist NOT LIKE "%_15_%"
3)LIKE / REGEXP混合返回1,912个结果。一个示例返回了第二种方法不是_4_10_18_23_
的结果-这是一个准确的结果,并且此结果中没有重复项,因此我不得不假定第二种方法(至少是第一种!)某种程度上缺少了某些东西。SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE '%_10_%' AND classlist NOT REGEXP '_3_|_15_'
此时,我摇摇头,不确定发生了什么。我总是会尝试寻找更深层次的问题,但是有人可以验证我是否在正确执行REGEXP和/或FULLTEXT方法?经过数小时的阅读和模仿后,看起来就像我在Google上看到的一样,但这是我第一次使用这两种方式。
最佳答案
根据评论,我找到了解决方案。首先,我将MYSQL条目设置为空白(在前面的示例中为4 8 10 15
)。
然后搜索工作如下:SELECT classlist, classcount FROM subgroupstest WHERE MATCH (classlist) AGAINST ('+10 -3 -15' IN BOOLEAN MODE)
SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE "% 10 %" AND classlist NOT LIKE "% 3 %" AND classlist NOT LIKE "% 15 %"
SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE '% 10 %' AND classlist NOT REGEXP ' 3 | 15 '
有趣的是,简单的“ Like”版本比其他两个版本快2-3倍!全文也比REGEXP稍慢。
关于mysql - 相同的FULLTEXT,REGEXP,LIKE搜索返回不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56500660/