2015-08-28 158 views
-1

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串是我的算法不正確的?我只想找到具有類似標籤名稱的行,但排除那些正在檢查的行。

+0

你能展示一些樣本數據嗎?也許是一個sqlfiddle? – jonmrich

+0

我懷疑圓括號是按照你真正想要的方式設置的。 –

回答

1

你必須圍繞與()的OR值,但與運算不需要這樣:

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