匹配查询不返回正确的结果

时间:2015-08-28 19:20:11

标签: php mysql sql

SQL:

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.我的算法是否不正确?我只想查找具有相似标记名称的行,但排除那些正在检查的行。

1 个答案:

答案 0 :(得分:1)

你必须用()包围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'相同。如果要删除不包含“字符串1”的标记,则应使用NOT LIKE '%string 1%'