2017-03-17 72 views
-3

我有這樣的查詢 enter image description hereSQL查詢不選擇屬性

SELECT * 
FROM  `GSheets` 
WHERE `sheetcat` = 'Unsubscribed' 
AND  `sheetcat` IS NOT NULL 
AND  `user` LIKE '%,r00t,%' 
OR  `user` LIKE 'r00t,%' 
OR  '%,r00t' 
OR  `user` = 'r00t' 

我指定sheetcat要退訂,但查詢響應是NULL(或空)? 爲什麼?

+1

你可能想在WHERE子句中的一些括號...(提示:用戶喜歡...) – jarlh

+0

感謝誰解決我的帖子版主,和其他所有幫助我諷刺地發佈更好的內容。 –

回答

1

當您以分隔字符串存儲事物列表時,這是一個問題。糟糕,糟糕,糟糕的數據設計。第一個和主要的建議是創建一個新的表格,每張表格一行,每個用戶一行。

現在,我們有時會被其他人的糟糕,糟糕,糟糕的設計決定所困擾。 MySQL提供find_in_set()這你想要做什麼:

SELECT g.* 
FROM `GSheets` g 
WHERE `sheetcat` = 'Unsubscribed' AND 
     FIND_IN_SET('r00t', `user`) > 0; 

注意sheetcat IS NOT NULL是多餘的。一個NULL值會失敗的第一個條件。除非你可能打算:

SELECT g.* 
FROM `GSheets` g 
WHERE `sheetcat` = 'Unsubscribed' OR 
     (sheetcat IS NOT NULL AND FIND_IN_SET('r00t', `user`) > 0); 

但這不會是我第一次猜測你的意圖。

如果您在OR條件附近放置了括號,則您的查詢也可以正常工作。但即使這太複雜了。使用LIKE一個簡單的版本是:

WHERE `sheetcat` = 'Unsubscribed' AND 
     CONCAT(',', `user`, ',') LIKE '%,r00t,%' 
+0

謝謝,真的很好的解釋! –

1

AND takes precedence over OR。你需要將你的信息OR條件:

SELECT * 
FROM  `GSheets` 
WHERE `sheetcat` = 'Unsubscribed' 
AND  
(  `user` LIKE '%,r00t,%' 
OR  `user` LIKE 'r00t,%' 
OR  `user` LIKE '%,r00t' 
OR  `user` = 'r00t' 
) 

第二sheetcat條件也是多餘的,可以刪除NULL檢查。

+0

感謝您提供快速和非混亂的答案;) –