Циклы PHP While из массивов

У меня есть таблица, содержащая имена участников и поле с несколькими идентификационными номерами. Я хочу создать запрос, который возвращает результаты, в которых любые значения в полях ID перекрываются с любыми значениями в массиве.

Например: фамилия: Смит имя: Джон id: 101, 103

У меня есть массив №1 со значениями 101, 102, 103.

Я хочу, чтобы запрос выводил всех участников, у которых в поле идентификатора указаны значения 101, 102 или 103 с несколькими перечисленными идентификаторами.

Array (  [0] => 101
         [1] => 102 
         [2] => 103 )

$sql="SELECT firstname, lastname, id
      FROM members WHERE id LIKE '%".$array_num_1."%'";
$result=mysql_query($sql);

while ($rows=mysql_fetch_array($result)) {
       echo $rows['lastname'].', '.$rows['firstname'].'-'.$rows['id'];
      }

Я попытался упростить его. Идентификаторы на самом деле хранятся в другой таблице, и я сгенерировал массив из этой таблицы.

$array_num_1 = array();
$sql_id="SELECT id FROM id_table WHERE id < 200";
$result_id=mysql_query($sql_id);
while($rows_id=mysql_fetch_array($result_id)){;
      $array_num_1[] = $rows_id['id'];
}

person Michael    schedule 21.03.2010    source источник
comment
Сохранение списка значений и последующая попытка написать к нему запрос — ужасный способ моделирования отношения. Мой совет - используйте вашу базу данных в качестве базы данных. Создайте дочернюю таблицу для отношения, а затем тривиально запросить.   -  person cletus    schedule 21.03.2010
comment
Идентификаторы фактически хранятся в отдельной таблице. См. правку выше.   -  person Michael    schedule 21.03.2010
comment
Итак, вы должны избавиться от этих идентификаторов в таблице участников.   -  person Your Common Sense    schedule 21.03.2010
comment
Пожалуйста, опубликуйте точную структуру обеих таблиц.   -  person Your Common Sense    schedule 21.03.2010
comment
Таблица участников: фамилия, имя, идентификатор Таблица идентификаторов: идентификатор, имя_идентификатора Например, пользователь делает выбор, что он хочет отображать всех участников и имена идентификаторов, у которых есть идентификаторы менее 200 связаны с их именем.   -  person Michael    schedule 21.03.2010


Ответы (3)


Нормализуйте свою базу данных. Вынесите эти идентификаторы в отдельную таблицу.

Изменить: И затем используйте ответы ниже

person Your Common Sense    schedule 21.03.2010
comment
Идентификаторы фактически хранятся в отдельной таблице. См. правку выше. - person Michael; 21.03.2010

Если вы должны сделать это следующим образом:

$sql = "SELECT firstname, lastname, id FROM members WHER id IN (" . implode(', ', $array) . ")"

Однако, как говорит @cletus в своем комментарии, база данных предназначена для такого рода вещей. Жесткое кодирование в массиве кажется неоптимальным способом ведения дел.

person ceejayoz    schedule 21.03.2010
comment
Я пробовал использовать функцию IN, но проблема в том, что в поле ID указано несколько номеров. Итак, WHERE id равен 101, 103 не работает с IN (101, 102, 103) - person Michael; 21.03.2010
comment
Тогда пора исправить структуру вашей базы данных. - person ceejayoz; 21.03.2010
comment
Идентификаторы фактически хранятся в отдельной таблице. См. правку выше. - person Michael; 21.03.2010

Вероятно, вы ищете IN:

SELECT firstname, lastname, id FROM members WHERE id IN (1, 2, 3);

Конечно, вы можете создать (1, 2, 3) динамически, например. с помощью взрыва.


Ой, я только что понял, что неправильно понял вашу схему базы данных. Как советовали другие, вы должны нормализовать его.

person middus    schedule 21.03.2010
comment
Что значит «нормализовать»? Я полуновичок в этом. - person Michael; 21.03.2010
comment
@middus (OT) где я видел твою фотографию в последнее время? ;) - person Gordon; 21.03.2010
comment
@Gordon Всегда интересно посмотреть, что здесь делают люди. :) - person middus; 21.03.2010