SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.12.2016 18:56:34

Дмитрий79
Участник
Зарегистрирован: 07.08.2016
Сообщений: 15

Фильтр по отдельным значением строки с разделителем

Здравствуйте!
Имеется столбец color, в которым хранятся значения параметра, разделённых через разделитель(","). И, например, несколько строк:

'красный'
'красный,жёлтый'
'красный,жёлтый,зелёный'
'жёлтый,зелёный'
'зелёный'
и т.д.

Возможные комбинации задаются через HTML-форму select с multichoice, т.е. пользователь может выбрать много вариантов.
Вопрос: Как отфильтровать те строки, где есть только зелёный; или только зелёный и жёлтый; или красный и жёлтый?

Я пробовал FIND_IN_SET, но, например, запрос

SELECT * FROM g_set WHERE FIND_IN_SET('зелёный',`color`)

вернёт строки, где встречается 'зелёный'(здесь их 3 штуки), а нужно только одну, последнюю.

Пожалуйста, помогите, решить задачу.

Неактивен

 

#2 10.12.2016 19:05:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Фильтр по отдельным значением строки с разделителем

Дмитрий79 написал:

Вопрос: Как отфильтровать те строки, где есть только зелёный;

SELECT * FROM g_set WHERE color='зелёный';


Дмитрий79 написал:

Вопрос: Как отфильтровать те строки, где есть только зелёный и жёлтый

SELECT * FROM g_set WHERE color='жёлтый,зелёный' or color='зелёный,жёлтый';

Неактивен

 

#3 10.12.2016 19:08:29

Дмитрий79
Участник
Зарегистрирован: 07.08.2016
Сообщений: 15

Re: Фильтр по отдельным значением строки с разделителем

А если значений параметров будет не 3, а 10(!). Как тогда составить все возможные комбинации? Это не подходит.

Неактивен

 

#4 10.12.2016 19:13:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Фильтр по отдельным значением строки с разделителем

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

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

Неактивен

 

#5 10.12.2016 19:57:06

Дмитрий79
Участник
Зарегистрирован: 07.08.2016
Сообщений: 15

Re: Фильтр по отдельным значением строки с разделителем

Спасибо за ответы. Про смену структуры думал. Просто таких параметров со множеством значений 4 штуки, а значит нужно создавать доп. таблицы, а так не хочется. Эх, не хватает мускулу explode!!!

Неактивен

 

#6 11.12.2016 13:06:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Фильтр по отдельным значением строки с разделителем

Самописные-то существуют варианты. на том же стековерфлоу встречал или вот тут
http://vexell.ru/2010/10/mysql-implode-explode/
отпишите, помогло ли ).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 12.12.2016 16:00:37

Дмитрий79
Участник
Зарегистрирован: 07.08.2016
Сообщений: 15

Re: Фильтр по отдельным значением строки с разделителем

Спасибо за ссылку!

Однако, в этой ситуации, если подумать одного explode мало, т.к. эту функцию пришлось бы менять для каждого параметра.

Я применил другой подход. Он пригоден там, где кол-во значений параметра не больше 60. bigint - 2^63.

Пронумеровал все значения параметра от 2^0 до 2^(n-1). Например, красный - 1, желтый - 2, зеленый - 4 и т.д. 8,16,32 - по степеням двойки.

В фильтре тоже задаётся комбинация(сумма) этих значений. Например, 6 - желтый и зеленый.

Потом

SELECT * FROM table WHERE `column` & filter_value.


Производительность нормальная. Нет никаких доп таблиц и джойнов.

Неактивен

 

#8 12.12.2016 20:27:09

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Фильтр по отдельным значением строки с разделителем

Ну да, битовая решетка - вполне себе решение, если хватает вариантов.
А вообще прочтите
http://sqlinfo.ru/articles/info/20.html
,я бы в этом направлении думал скорее.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 15.12.2016 15:45:07

Дмитрий79
Участник
Зарегистрирован: 07.08.2016
Сообщений: 15

Re: Фильтр по отдельным значением строки с разделителем

Спасибо за ссылку. Однако у хостера Мускул 5.1.7. А для JSON требуется 5.7.7. Похоже на реализацию NoSQL внутри MySQL

Отредактированно Дмитрий79 (15.12.2016 15:45:23)

Неактивен

 

#10 15.12.2016 20:17:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2419

Re: Фильтр по отдельным значением строки с разделителем

Мы о том не говорили, но опираться в ограничения хостера - все же прошлый век. Сейчас лучше брать виртуалки и ставить туда те версии софта, которые Вам нужны.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson