Задать вопрос

Как сделать поиск в строке с разделителем в mysql?

Есть таблица с столбцами

id | value
1  | L
2  | L
3  | L
4  | L;XL
5  | M;L

Прилетает запрос найти наличие у товара нужных размеров. Допустим M и L
Делал запрос вида

select * from table where value in ('M','L')

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

Смотрел в сторону find_in_set

select * from table where find_in_set('L', replace(value, ';', ','))


Но для это подойдет для поиска одного размера, а мне прилетает несколько. Не ужели скажем если 10 размеров прилетит, писать 10 запросов для проверки каждого размера?

Помогите идей, в какую сторону смотреть?
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
@Vitsliputsli
Не 10 запросов, а 10 find_in_set. Или 1 регулярка.
Но лучше, нормализуйте базу.
Ответ написан
@alexalexes
Но для это подойдет для поиска одного размера, а мне прилетает несколько. Не ужели скажем если 10 размеров прилетит, писать 10 запросов для проверки каждого размера?

Да, будете страдать по полной, раз нет нормализованной структуры данных.
Ни нормального выражения с in не построить, ни возможности создать индекс для ускорения поиска.
Время поиска будет линейно расти от количества записей и умножаться на кол-во or, так как нельзя воспользоваться индексом.
select * from table
where 1 = 1 -- чтобы можно было однотипно подставить выражения с and или or, не заморачиваясь в каких случаях нужен and/or, а в каких нет.
or find_in_set('L', replace(value, ';', ','))
or find_in_set('XL', replace(value, ';', ','))
...
or find_in_set('XXXL', replace(value, ';', ','))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы