2014-09-23 4 views
0

У меня есть поле в моей базе данных под названием population_served. Он может содержать до четырех значений - взрослых, подростков, детей или гериатрических. Например:Оператор выбора MySQL с использованием значений массива

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" /> 

Я хочу, чтобы мой выбор чтобы найти любую строку, содержащую то, что я проверил. Если я проверю Adult, тогда ROW1 и ROW3 будут результатом. То же самое с детьми. Если я нахожу только Гериатрический, тогда 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   | 
+---------+--------+----------------------+ 
+0

Покажите нам, как хранить эти данные в таблице вашей базы данных. – zaratustra

+1

** SQL injection alert ** ... вы вставляете нефильтрованный ввод пользователя в свою базу данных. – lxg

+0

Расположение базы данных находится в исходном сообщении – mbeasley

ответ

0

Вы должны использовать регулярное выражение:

select * 
    from (
     select 'Adults' as name union all 
     select 'Geriatric' union all 
     select 'Adults, Children' 
     ) t 
where name regexp 'Adults|Children' 

SQLFiddle

0

ROW 3 не возвращается, потому что "Взрослые, дети" не один «Взрослый» или «Дети». populations_served атрибут - это строка, а не SET, как вы определяете в статье IN.

Может быть, стоит посмотреть на MySQL SET type и FIND_IN_SET function

Смежные вопросы