我有这个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,我得到以下结果:
为什么我在user_class字段中得到的结果为'12',因为我使用的是'12' NOT IN(...
?
如果我不能在IN()运算符中使用user_class
,那么它的替代方法是什么?
由于
答案 0 :(得分:3)
IN
或NOT 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来避免在一个字段中出现多个值的混乱。