@freeeeez

Как искать подстроку из массива в БД?

Есть массив array(2,3,4)
В БД есть столбец, который может содержать такие значения "2", "2,3", "2,4", "2,3,4" и пр.
Как написать условие поиска наподобие whereIn(numbers,array(2,3,4)) только чтобы искал как конструкция LIKE %...%?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Битовой маской: 1,2,4,8,16,32,64,.... сумма цифр - даст битовую маску нужного опциона.
Пусть есть массив: array(2,3,4) или array("мама","мыла","раму") - не важно!
Важно, что максимум у него 3 элемента.
Тогда делаем битовую маску для всех 3-х пунктов:
1+2+4=7 (что есть в бинарном виде: 111)
Т.е. если в поле БД будет 7, то мы знаем, что выбраны все 3 значения.

1+0+4=5 (что есть в бинарном виде: 101)
Т.е. если в поле БД будет 5, то мы знаем, что выбрано первое и последнее значение
и т.д.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
glebovgin
@glebovgin
Full Stack Web Developer
Если не больше 9, то можно использовать REGEX?
SELECT * FROM table WHERE field REGEXP '2|3|4';
Предварительно, конечно, надо сделать implode('|', $array);

Если числа будут больше 9, то надо подумать.
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
Я понимаю что "задача такова и решаем как можем", но в идеале нужно разнести такие значения в отдельную таблицу с отношением многие ко многим, ибо like не самая быстрая команда, даже в выражении like ...%, про like %..% вообще молчу. А так - сплошные извращения наподобие `numbers` like %2% and `numbers` like %3% и так до конца, я молчу о проблемах с числами более 9, где надо определить 12 или 1,2.
Ответ написан
Комментировать
maximw
@maximw
Сконвертировать поле в тип SET.
В запросах использовать FIND_IN_SET()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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