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

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

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

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

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

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

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

dmaytry79Что значит "формализованный список" и " нормализованный набор данных "?Список в CSV ненормализован. Нормализация в данном случае - это конвертация CSV в набор записей. Как поля color в таблице, так и набора параметров фильтра. Формализация возможна в случае, когда цветам соответствуют словарные коды, при этом сами искомые цвета в тексте запроса заменяются их кодами, и не требуется обращение к словарю во время исполнения запроса.
...
Рейтинг: 0 / 0
Фильтр по отдельным значением строки с разделителем
    #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
Фильтр по отдельным значением строки с разделителем
    #39365003
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmaytry79,
как частный вариант очень хорошее решение
...
Рейтинг: 0 / 0
Фильтр по отдельным значением строки с разделителем
    #39365039
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормальный подход. Ты собственно использовал обычную масочную формализацию.
...
Рейтинг: 0 / 0
Фильтр по отдельным значением строки с разделителем
    #39365483
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dmaytry79Потом
Код: sql
1.
SELECT * FROM table WHERE `column` & filter_value.




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


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