使用MySQL 5.6,此请求
SELECT foo
FROM bar
WHERE groupId = '1'
AND MATCH (foo) AGAINST ('"myQuery"' IN BOOLEAN MODE);
和
SELECT foo
FROM bar
WHERE groupId = '1'
AND foo like '%myQuery%';
返回两个正确的结果,但是当我将两者与:]时>
SELECT foo FROM bar WHERE groupId = '1' AND ( MATCH (foo) AGAINST ('"myQuery"' IN BOOLEAN MODE) OR foo LIKE '%myQuery%' );
我得到了一些额外的结果,这些结果不会出现在前两个请求中的任何一个中,并且根本不包含
myQuery
。
我错过了括号吗?还是可能与任何类型的索引缓存有关?有时结果是正确的,突然之间,结果不再正确。
我也尝试过
这是我的请求的结果,带有WHERE ( groupId = '1' AND MATCH (foo) AGAINST ('"myQuery"' IN BOOLEAN MODE) ) OR ( groupId = '1' AND foo like '%myQuery%' );
[Edit:
myQuery = 'gold'
。第一和第二个返回:
'花式黄金''好金''超级尼斯金'“丑陋的黄金”
最后一个返回:
'Cornices钻石'“自定义”花式黄金'好金''超级尼斯金'“丑陋的黄金”
我注意到的另一件事,我运行了
Optimize table bar
,然后结果是正确的。我再次运行了第一个请求,然后第三个结果不再正确。因此,我真的怀疑与全文索引有关的内容。
Edit 2
:这是一个dbFiddle:https://www.db-fiddle.com/f/iSXdTK7EzfoQ46RgDX7wF3/1使用MySQL 5.6,此请求从bar WHERE groupId ='1'中选择foo并且再次匹配(foo)(在布尔型模式下为'“ myQuery”');和SELECT foo FROM bar WHERE groupId ='1'并且foo如'%myQuery%'...
自连接似乎通过欺骗数据库以为它与两个谓词中的名称列不同而解决了这个问题:
我非常有一种强烈的感觉,您所描述的就是查询看起来像的样子,但是您实际上是使用代码来构成查询,并且您的代码中存在一个错误,导致myQuery
为空...那么您将与始终匹配的'%%'
匹配。
这似乎给您想要的结果