2012-01-11 2 views
0

У меня есть таблица в базе данных MySQL. В этой таблице есть текстовое поле под названием «выбор», в котором хранятся пронумерованные значения, разделенные символом канала (пример: 44 | 5 | 23 | 546 | .....). У меня также есть php-массив: $ values ​​= array (63,35,7,5);лить текстовое поле в массив в mysql select query

Мне нужно сослаться на поле выбора в качестве массива параметров (разделенных символом «|») и выбрать только строки, содержащие хотя бы одно из массива чисел в $ values.

Надеюсь, я объяснил свою проблему достаточно точно, потому что мой английский очень беден ... Спасибо.

+3

Я бы сказал, что проблема _actual_ заключается в том, что дизайн базы данных не сохраняет реляционные элементы в виде отдельных фрагментов данных. Почему бы не разделить это поле с разделителями каналов на отдельную таблицу? Запрос будет намного проще, поскольку SQL предназначен для запроса реляционных таблиц. – David

+2

Проблема в том, что поле обычно содержит только одно значение. Не несколько значений. Если вам нужно иметь несколько значений в одном поле, у вас должна быть таблица с отношением (отношение «многие-ко-многим»). См. Здесь для получения дополнительной информации: http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php – jValdron

+0

Это сильная сторона, и я изменю эту логику, если не смогу оштрафовать более простое решение для это. Изменение структуры db будет стоить мне много времени, и я немного ленив. –

ответ

2

Если вы хотите, чтобы получить строку, которая содержит, по меньшей мере, один номер в $values массив, SQL выглядит следующим образом:

$values = array(63,35,7,5); 

foreach ($values as $value) { 

    $sql = "select * from tablename where selection like '%{$value}|%' or '%|{$value}%'"; 

} 
+3

Это не сработает при поиске «2», а в поле «12 | 13». вам нужны 4 случая для этого рода плохой конструкции. 1) прямое равенство (одно значение), значение в начале ('$ v |%'), значение в конце ('% | $ v') и значение в середине ('% | $ v |% '). –

+0

@MarcB - Если бы вы могли добавить это в отдельный ответ, я мог бы отметить его как принятый. Спасибо! –

0

Если значения в массиве находятся в соответствующем порядке для поиска уже, вы можете создать свой запрос с чем-то вроде этого:

$selection_searched = implode('|', $values); 
$query = "SELECT * FROM your_table WHERE selection = '$selection_searched'"; 

Учтите, что вы, вероятно, хотите проверить массив $ значения Fisrt, чтобы проверить, если он не пуст, и т.д. Проверьте руководство по: http://php.net/implode

+0

не будет работать: 'SELECT '4 | 3 | 5 |' = '4 | 5 | 3 |' 'значения в поле не сортируются каким-либо конкретным образом –

+0

Тогда, может быть, вам стоит сменить модель, поместив поля в другую таблицу. – elias