2012-06-22 3 views
1

У меня есть это MySQL заявление:NOT IN() возвращает странный результат в 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

Почему я получаю результаты, которые имеют «12» в поле user_class, так как я использую '12' NOT IN(... ??

Если я не могу использовать user_class в операторе IN(), что это за альтернатива?

Благодаря

ответ

3

IN или NOT IN не работает так, проверьте функцию FIND_IN_SET

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

Я хочу, чтобы у НЕ было «12» в списке, поэтому это = 0. Спасибо за ответ! –

1

Синтаксис выражение IN (значение, ...)

WHERE `user_class` NOT IN ('12') 

Если два или более таблиц использовать то же имя столбца, она сомнительна, и Вы должны должны префикс или ник ваши таблицы четко определяют, какой столбец вы вызываете. Имя

WHERE table.column NOT IN ('12') 

Ник:

SELECT table a, table2 b 
+0

Это также работает! Жаль, что я не могу выбрать 2 ответа: P Спасибо в любом случае! –

+0

Вы можете ответить на мой вопрос. – Kermit

1

value IN (...) проверяет, если value является одним из пунктов, перечисленных в (...). В вашем случае список содержит только одно значение: значение столбца user_class. Строка '12' не равна строке '3,6,9,12', поэтому она не находит соответствия. IN не ищет соответствующие подстроки в значении столбца.

Поскольку у вас есть несколько разделенных запятыми значений в одном поле, вы должны использовать FIND_IN_SET().


Если у вас есть возможность реструктуризации данных, вы должны использовать database normalization, чтобы избежать этой путаницы иметь несколько значений в одном поле.

+1

Спасибо за объяснение. –

Смежные вопросы