Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Фильтр по отдельным значением строки с разделителем / 14 сообщений из 14, страница 1 из 1
10.12.2016, 18:54
    #39364118
dmaytry79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
Здравствуйте!
Имеется столбец color , в которым хранятся значения параметра, разделённых через разделитель(","). И, например, несколько строк:

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

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

Я пробовал FIND_IN_SET, но, например, запрос
Код: sql
1.
SELECT * FROM g_set WHERE FIND_IN_SET('зелёный',`color`)

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

Пожалуйста, помогите, решить задачу.
...
Рейтинг: 0 / 0
10.12.2016, 19:47
    #39364134
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
dmaytry79 Как отфильтровать те строки, где есть только зелёный;
Например, так:
1) удваиваем все запятые
2) добавляем по одной запятой в начале и в конце
3) заменяем литерал ',зелёный,' на пустую строку
4) отбираем те записи, где после всех действий осталась пустая строка

PS. Не вздумай так делать на самом деле... лучше займись нормализацией передаваемых от юзера данных.
...
Рейтинг: 0 / 0
10.12.2016, 20:00
    #39364144
dmaytry79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
Это значит, менять структуру, я правильно понял?
...
Рейтинг: 0 / 0
10.12.2016, 20:37
    #39364164
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
Нет, неправильно, менять нужно технологию. И подход.
Между пользователем и MySQL-сервером есть посредники. Полагаю, минимум два. Это веб-сервер и PHP-сервер. От веб-сервера интеллекта ожидать трудно, а вот PHP (ну или какой там у тебя скрипт-интертрепатор) вполне мог бы пережевать список слов во вменяемый формализованный список, а ещё лучше в нормализованный набор данных во временной таблице.
...
Рейтинг: 0 / 0
10.12.2016, 22:25
    #39364210
dmaytry79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
Не совсем понятно. От клиента(HTML-форма) через POST отправляется массив значений параметра(покажи мне товары чёрного, белого, серого цветов) на PHP-сервер. Есть таблица товаров с полем `color`, в котором через запятую перечислены возможные комбинации из 10 цветов. Как выбрать нужные товары? Мне с помощью PHP нужно создать запрос.
Что значит "формализованный список" и " нормализованный набор данных "?
...
Рейтинг: 0 / 0
10.12.2016, 23:24
    #39364236
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
dmaytry79Мне с помощью PHP нужно создать запрос.Нет вменяемого способа сравнивать несортированные CSV.
Конвертируй список своих цветов в подзапрос, который получает каждый отдельный цвет в запись. Связывай этот подзапрос с основной таблицей по вхождению подстроки и сравнивай COUNT(*) и COUNT(color = @color). Для случая, когда все цвета имеются, и нет лишних, полученные количества должны быть равны.

dmaytry79Что значит "формализованный список" и " нормализованный набор данных "?Список в CSV ненормализован. Нормализация в данном случае - это конвертация CSV в набор записей. Как поля color в таблице, так и набора параметров фильтра. Формализация возможна в случае, когда цветам соответствуют словарные коды, при этом сами искомые цвета в тексте запроса заменяются их кодами, и не требуется обращение к словарю во время исполнения запроса.
...
Рейтинг: 0 / 0
12.12.2016, 15:26
    #39364974
dmaytry79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
Спасибо, Akina, за технологию, но всё же не совсем понятно, как эти реализовать на практике, да к тому же, чтобы и производительность была на уровне.

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

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

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

Потом
Код: sql
1.
SELECT * FROM table WHERE `column` & filter_value.



Производительность нормальная. Нет никаких доп таблиц и джойнов.
...
Рейтинг: 0 / 0
12.12.2016, 15:49
    #39365003
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
dmaytry79,
как частный вариант очень хорошее решение
...
Рейтинг: 0 / 0
12.12.2016, 16:12
    #39365039
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
Нормальный подход. Ты собственно использовал обычную масочную формализацию.
...
Рейтинг: 0 / 0
13.12.2016, 10:03
    #39365483
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
dmaytry79Потом
Код: sql
1.
SELECT * FROM table WHERE `column` & filter_value.




А это действительно решает поставленную задачу?
...
Рейтинг: 0 / 0
13.12.2016, 14:39
    #39365761
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
paverА это действительно решает поставленную задачу?
Конечно, нет. Для решения задачи нужен Bitwise XOR. Но если автора устраивает...
...
Рейтинг: 0 / 0
15.12.2016, 15:38
    #39367859
dmaytry79
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
А почему AND не решает задачу?
...
Рейтинг: 0 / 0
16.12.2016, 05:23
    #39368256
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
dmaytry79,
возвращает запись, если хотя бы один цвет совпадет.
Для вашего условия нужен NOT Bitwise XOR
...
Рейтинг: 0 / 0
16.12.2016, 05:30
    #39368258
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фильтр по отдельным значением строки с разделителем
... что, впрочем, эквивалентно WHERE `column` = filter_value
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Фильтр по отдельным значением строки с разделителем / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]