繁体   English   中英

匹配查询未返回正确结果

[英]Match against query not returning correct results

查询语句:

SELECT * FROM tags t WHERE 
MATCH(t.tag) AGAINST ('string 1') OR 
MATCH(t.tag) AGAINST ('string 2') OR 
MATCH(t.tag) AGAINST ('string 3') OR 
MATCH(t.tag) AGAINST ('string 4') OR 
MATCH(t.tag) AGAINST ('string 5') AND 
(t.tag NOT LIKE 'string 1' AND t.tag NOT LIKE 'string 2' AND 
 t.tag NOT LIKE 'string 3' AND t.tag NOT LIKE 'string 4' AND 
 t.tag NOT LIKE 'string 5')

上面的查询仍然返回字符串 1、字符串 3 和字符串 4。我的算法不正确吗? 我只想找到具有相似标签名称的行,但排除正在检查的行。

您必须用 () 将 OR 括起来,但 AND 不需要这样:

SELECT * FROM tags t WHERE 
(MATCH(t.tag) AGAINST ('string 1') OR 
MATCH(t.tag) AGAINST ('string 2') OR 
MATCH(t.tag) AGAINST ('string 3') OR 
MATCH(t.tag) AGAINST ('string 4') OR 
MATCH(t.tag) AGAINST ('string 5')) AND 
t.tag NOT LIKE 'string 1' AND t.tag NOT LIKE 'string 2' AND 
 t.tag NOT LIKE 'string 3' AND t.tag NOT LIKE 'string 4' AND 
 t.tag NOT LIKE 'string 5'

看看“运算符优先级”:

https://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html

AND 通常在 OR 之前解析,但在您的情况下,所有 OR 必须在作为一个组之前解析,因此我们添加 () 以强制它们在 AND 之前解析。

另一个可能的问题: NOT LIKE 'string 1'<> 'string 1' 如果你想删除不包含 'string 1' 的标签,你应该使用NOT LIKE '%string 1%'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM