2017-03-17 42 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

感谢您提供快速和非混乱的答案;) –