【发布时间】:2019-10-23 08:02:54
【问题描述】:
我尝试使用三个不同的 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 上看到的那样,但这是我第一次使用其中任何一种。
【问题讨论】:
-
一条评论:全文索引受制于最小(和最大)单词和标记长度,以及排除的单词列表dev.mysql.com/doc/refman/8.0/en/fulltext-fine-tuning.html,下划线字符也是 LIKE 中的通配符,除非它被转义
-
啊!这解释了那部分。我现在用#替换了_书挡(如
#10),并适当替换了代码;现在方法 2 和 3 正在工作。我确实意识到 FULLTEXT 需要同样的东西,所以我在这里更新了它(虽然仍然没有结果):SELECT classlist, classcount FROM subgroupstest WHERE MATCH (classlist) AGAINST ('+#10# -#3# -#15#' IN BOOLEAN MODE) -
对于全文:尝试将
ft_min_word_len设置为 1 并使用空格作为分隔符。 -
@AlexGold 不要在你的问题中写出解决方案。您可以就您的问题发布答案。