У меня есть поле в моей базе данных под названием populations_served. Он может содержать до четырех значений: «Взрослый», «Подростковый», «Детский» или «Гериатрический». Например:
ROW1: взрослые
ROW2: гериатрический
ROW3: взрослые, дети
Моя форма поиска имеет флажки для этих параметров:
<input name="populations[]" type="checkbox" id="populations[]" value="Adults" />
<input name="populations[]" type="checkbox" id="populations[]" value="Adolescents" />
<input name="populations[]" type="checkbox" id="populations[]" value="Children" />
<input name="populations[]" type="checkbox" id="populations[]" value="Geriatric" />
Я хочу, чтобы мой оператор select нашел любую строку, содержащую то, что я проверил. Если я проверю Adult, то ROW1 и ROW3 будут результатом. То же самое с детьми. Если я нажму только Geriatric, результатом будет ROW2. Вот то, что я придумал, но это не работает:
$populations = implode("', '",$_POST["populations"]);
$SQL2 = "SELECT * FROM membership WHERE populations_served IN ('$populations');";
Это приводит к:
SELECT * FROM membership WHERE populations_served IN ('Adults', 'Children');
Но возвращается только ROW1, а не ROW1 & ROW3. Если я выберу все флажки, то будут возвращены строки, имеющие только гериатрические значения. Я не могу понять результаты!
Вот как выглядит база данных:
+---------+--------+----------------------+
| f_name | l_name | populations_served |
+---------+--------+----------------------+
| Anamika | Pandit | Adults |
| Mary | Anchor | Geriatric |
| Roger | Lewis | Adults, Children |
| Danny | Gibson | Geriatric |
+---------+--------+----------------------+
Вам нужно использовать регулярное выражение:
select *
from (
select 'Adults' as name union all
select 'Geriatric' union all
select 'Adults, Children'
) t
where name regexp 'Adults|Children'
Строка 3 не возвращается, потому что «Взрослые, дети» не являются «взрослыми» или «детьми».
populations_served
атрибут является строкой, а не SET, как вы определяете на IN
пункт.
Может быть, стоит взглянуть на MySQL SET тип а также Функция FIND_IN_SET