Доброго времени, имею InstantCMS.
Фильтры - чекбоксы.
Пример:
- Мама - отмечен
- Папа
- Бабушка - отмечен
- Дедушка
- Внук - отмечен
Сохраняем,получаем в поле БД:
10101
Сейчас выбирается по условию LIKE.
Если, например, отметить Дедушку и Внука, то в запросе в БД будет сформирована такая маска:
LIKE '___11%' - и запрос не вернет ничего. Как сделать чтобы фильтрация заработала в логике "или"?
Т.е. "Внук" - истина, поэтому нужно вернуть результат. Через LIKE, похоже, что не реализовать такое. Как здесь поступить?
Если вы представили свои чекбоксы, как биты, так и продолжайте с ними работать.
Ваше 10101 - это 21.
Дед и внук - это 3.
Сравниваем по маске 21 & 3 = 1. Это больше 0, значит нам подходит.
Проверяем на папке - это 8. 21 & 8 = 0. А это 0, значит мимо.
Другое дело, что с индексами возможно придётся повозиться.
freeExec, чего-то не получилось заставить работать ваш вариант. Наверное, я нуб в MySQL.
Пришла мысль преобразовать в массив вариантов и засунуть в IN.
Т.е.
WHERE rodstvo IN ('00011', '00001', '00010', '10001', '...n');
В этой таблице 500...700 строк. Как думаете, сойдет или плохой вариант?
Только я не пойму, как движок MySQL понимает, что нужно свести сравнение к одной системе исчисления. Я прислал десятичное число в запросе, а в поле хранятся двоичные данные. Извиняюсь за свою дотошность))
freeExec, дико извиняюсь, но есть проблема. В поле int - не записывается битовая маска.
Вместо 00001 - запишется 1.
Атрибут unsigned zerofill - просто ставит много нулей. Как быть?
Вот похожий пример: sqlfiddle.com/#!9/bd5f72/9
единственный нюанс - в битовой маске может быть только 64 значения :)
А иначе нужна вспомогательная таблица, фильтровать по строке прям совсем не очень вариант.