NOT IN()在mysql中返回奇怪的结果

时间:2012-06-22 16:39:19

标签: mysql

我有这个mysql声明:

SELECT  `review_userid` ,  `book_id` ,  `review_id` ,  `user_class` , COUNT( review_id ) 
FROM  `booklist_books` 
LEFT JOIN  `booklist_reviews` ON booklist_books.book_id = booklist_reviews.review_bookid
LEFT JOIN  `e107_user` ON booklist_reviews.review_userid = e107_user.user_id
WHERE '12' NOT IN (`user_class`)
GROUP BY  `review_userid` 
ORDER BY COUNT(`review_id`) DESC 
LIMIT 0 , 100

user_class是逗号分隔的字符串(例如:1,2,3,4,5),如下所示。

使用phpmyadmin,我得到以下结果:

mysql result

为什么我在user_class字段中得到的结果为'12',因为我使用的是'12' NOT IN(...

如果我不能在IN()运算符中使用user_class,那么它的替代方法是什么?

由于

3 个答案:

答案 0 :(得分:3)

INNOT IN不能正常工作,请检查函数FIND_IN_SET

WHERE FIND_IN_SET('12', `user_class`) = 0

答案 1 :(得分:1)

语法是expr IN(value,...)

WHERE `user_class` NOT IN ('12')

如果两个或多个表使用相同的列名,则它是不明确的,您应该对表进行前缀或昵称,以清楚地定义您要调用的列。

WHERE table.column NOT IN ('12')

尼克名字:

SELECT table a, table2 b

答案 2 :(得分:1)

value IN (...)检查value(...)中列出的项目之一。在您的情况下,列表只包含一个值:user_class列的值。字符串'12'不等于字符串'3,6,9,12',因此找不到匹配项。 IN不会在列的值中搜索匹配的子字符串。

由于您在一个字段中有多个以逗号分隔的值,因此您需要使用FIND_IN_SET()


如果您可以选择重组数据,则应使用database normalization来避免在一个字段中出现多个值的混乱。