Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Имеется столбец color, в которым хранятся значения параметра, разделённых через разделитель(","). И, например, несколько строк:
'красный'
'красный,жёлтый'
'красный,жёлтый,зелёный'
'жёлтый,зелёный'
'зелёный'
и т.д.
Возможные комбинации задаются через HTML-форму select с multichoice, т.е. пользователь может выбрать много вариантов.
Вопрос: Как отфильтровать те строки, где есть только зелёный; или только зелёный и жёлтый; или красный и жёлтый?
Я пробовал FIND_IN_SET, но, например, запрос
Неактивен
Дмитрий79 написал:
Вопрос: Как отфильтровать те строки, где есть только зелёный;
Дмитрий79 написал:
Вопрос: Как отфильтровать те строки, где есть только зелёный и жёлтый
Неактивен
А если значений параметров будет не 3, а 10(!). Как тогда составить все возможные комбинации? Это не подходит.
Неактивен
можно сравнивать один раз каждый параметр и проверять, чтобы длина поля равнялась сумме длин параметров.
но это будет извращение с т.з. производительности и здравого смысла, меняйте структуру
Неактивен
Спасибо за ответы. Про смену структуры думал. Просто таких параметров со множеством значений 4 штуки, а значит нужно создавать доп. таблицы, а так не хочется. Эх, не хватает мускулу explode!!!
Неактивен
Самописные-то существуют варианты. на том же стековерфлоу встречал или вот тут
http://vexell.ru/2010/10/mysql-implode-explode/
отпишите, помогло ли ).
Неактивен
Спасибо за ссылку!
Однако, в этой ситуации, если подумать одного explode мало, т.к. эту функцию пришлось бы менять для каждого параметра.
Я применил другой подход. Он пригоден там, где кол-во значений параметра не больше 60. bigint - 2^63.
Пронумеровал все значения параметра от 2^0 до 2^(n-1). Например, красный - 1, желтый - 2, зеленый - 4 и т.д. 8,16,32 - по степеням двойки.
В фильтре тоже задаётся комбинация(сумма) этих значений. Например, 6 - желтый и зеленый.
Потом
Неактивен
Ну да, битовая решетка - вполне себе решение, если хватает вариантов.
А вообще прочтите
http://sqlinfo.ru/articles/info/20.html
,я бы в этом направлении думал скорее.
Неактивен
Спасибо за ссылку. Однако у хостера Мускул 5.1.7. А для JSON требуется 5.7.7. Похоже на реализацию NoSQL внутри MySQL
Отредактированно Дмитрий79 (15.12.2016 15:45:23)
Неактивен
Мы о том не говорили, но опираться в ограничения хостера - все же прошлый век. Сейчас лучше брать виртуалки и ставить туда те версии софта, которые Вам нужны.
Неактивен