相同的FULLTEXT,REGEXP,LIKE搜索返回不同的结果

时间:2019-06-07 20:07:52

标签: mysql database

我尝试使用三个不同的MYSQL查询来搜索单个列(类列表);目标是该列应包含_10_,但不应包含_3__15_(示例值可能类似于_4_8_10_15_,而在给定{{1} }。

我尝试了三种不同的方法,所有这三种方法都没有错误,但结果却不同:

1)FULLTEXT搜索(在类列表上启用了FULLTEXT索引)没有返回错误,也没有返回结果。

_15_

2)简单的LIKE子句返回516行。

SELECT classlist, classcount FROM subgroupstest WHERE MATCH (classlist) AGAINST ('+10 -3 -15' IN BOOLEAN MODE)

3)LIKE / REGEXP混合返回了1,912个结果。一个示例返回第二种方法不是SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE "%_10_%" AND classlist NOT LIKE "%_3_%" AND classlist NOT LIKE "%_15_%"-这是一个准确的结果,并且此结果中没有重复项,因此我不得不假设第二种方法(至少是第一种!)某种程度上缺少

_4_10_18_23_

在这一点上,我摇摇头,不确定发生了什么。我总是会尝试寻找更深层次的问题,但是有人可以验证我是否在正确执行REGEXP和/或FULLTEXT方法?经过最后几个小时的阅读和模仿后,看起来就像我在Google上看到的一样,但这是我第一次使用其中一种。

1 个答案:

答案 0 :(得分:0)

根据评论,我找到了解决方案。首先,我将MYSQL条目设置为空白(在前面的示例中为const TextureData BLOCK_TEXTURE(8, 8); const std::array<float, B_LAST * 6> TEXTURE_COORDS = make_array<float, B_LAST * 6>([](unsigned int index){ return index%2 == 0? tex_coord_x(TEXTURE_INDICES[index / 2]) : tex_coord_y(TEXTURE_INDICES[index / 2 + 1]); }); )。

然后,搜索工作如下:

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 %"

有趣的是,简单的“ Like”版本比其他两个版本快2-3倍!全文也比REGEXP稍慢。