ego*_*goz 11 mysql sql full-text-search mysql-5.6
使用MySQL 5.6时,此请求
SELECT foo
FROM bar
WHERE groupId = '1'
AND MATCH (foo) AGAINST ('"myQuery"' IN BOOLEAN MODE);
Run Code Online (Sandbox Code Playgroud)
和
SELECT foo
FROM bar
WHERE groupId = '1'
AND foo like '%myQuery%';
Run Code Online (Sandbox Code Playgroud)
返回两个正确的结果,但是当我将两者与结合时:
SELECT foo
FROM bar
WHERE groupId = '1'
AND (
MATCH (foo) AGAINST ('"myQuery"' IN BOOLEAN MODE)
OR foo LIKE '%myQuery%'
);
Run Code Online (Sandbox Code Playgroud)
我得到了一些额外的结果,这些结果没有出现在前两个请求中的任何一个中,并且根本没有包含myQuery。
我想念的括号有什么花招吗?
还是可能与任何类型的索引缓存有关?有时结果是正确的,突然之间,结果不再正确。
我也尝试过
WHERE (
groupId = '1' AND MATCH (foo) AGAINST ('"myQuery"' IN BOOLEAN MODE)
) OR (
groupId = '1' AND foo like '%myQuery%'
);
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的请求的结果,带有myQuery = 'gold'。
第一个和第二个返回:
'花式黄金'
'尼斯黄金'
'超级尼斯黄金'
'丑陋黄金'
最后一个返回:
“飞檐钻石”
“自定义”
“花式黄金”
“黄金尼斯”
“超漂亮黄金”
“丑女金”
我注意到了另一件事,我跑步了Optimize table bar,然后结果是正确的。我再次运行了第一个请求,然后第三个结果不再正确。所以我真的怀疑与全文索引有关的东西。
编辑2:这是一个dbFiddle:https ://www.db-fiddle.com/f/iSXdTK7EzfoQ46RgDX7wF3/1
我有一种非常强烈的感觉,您所描述的是您希望查询看起来像什么,但您实际上正在使用代码来组成查询,并且您的代码中有一个错误导致空myQuery...然后您正在匹配'%%'始终匹配的内容。
当您调用错误时,您应该发布实际的查询,而不是对查询在转录为实际用途时可能是什么样子的一厢情愿的解释。
您是否可能使用? ?占位符,并且在数据绑定时忘记将第二个值设置为等于第一个值?