Как выбрать элемент в поле списка разделенных запятыми в MySQL - PullRequest
2 голосов
/ 26 мая 2011

У меня есть таблица с именем product, где в поле category я вставил от 5 до 6 категорий.

Например, 2,3,4,5,12 просто так.

Но когда я использую этот запрос, он не работает:

SELECT * FROM product WHERE category in '3' 

SELECT * FROM `product` WHERE `category` LIKE '%3%' 

Может кто-нибудь помочь исправить это

Ответы [ 4 ]

8 голосов
/ 26 мая 2011
SELECT * FROM product WHERE FIND_IN_SET('3',category); 

См .: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

Если у вас нет find_in_set, этот код будет эквивалентен:

SELECT * FROM product 
WHERE category = '3' or category LIKE '%,3,%' 
      or category LIKE '3,%' or category LIKE '%,3'; 

В противном случае вы получите ложное срабатывание 3 на '13, 23, 40'.

Предупреждение
Учтите, однако, что размещать список CSV в поле - очень плохая практика.
Вы получите гораздо лучшую производительность, извлекая списоквне поля и положить его в другую таблицу в соотношении 1 к N.

2 голосов
/ 26 мая 2011

Лучше всего создать еще одну таблицу!

т.е .: Категории продукта Int Productid int категория

SELECT * FROM product p 
INNER JOIN product_categories pc ON pc.productid = p.productid 
WHERE pc.category = '3'

с тем, как вы хотите его реализовать, у вас также будет проблема, когда категория «13» доступна, но вы хотите иметь «3»

1 голос
/ 26 мая 2011

Оператор IN не будет работать, потому что вы запрашиваете точное совпадение категории с «3», тогда как на самом деле это «2,3,4,5,12». Я думаю, что это также должно быть в круглых скобках.

Как сказал пользователь 737767, вам действительно нужно нормализовать свою базу данных, чтобы у вас была таблица категорий, таблица продуктов и другая таблица, показывающая, к каким категориям относится каждый продукт.

Ваше утверждение LIKE также является плохой идеей, поскольку поиск "3" также приведет к результатам, подобным "23"

1 голос
/ 26 мая 2011

Прошу прощения за это, но вам следует перепроектировать базу данных.
Использование одного поля для хранения нескольких соединений всегда будет проблемой.

Гораздо проще создать дополнительную таблицу, в которой хранятся отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...