2016-06-30 1 views
0

Я пишу запрос, который должен позволить мне искать в разных столбцах для определенной строки поиска.mysql - используя concat для значения внутри одной ячейки

Моя база данных в 3 колонки мне нужно искать и сравнивать строку поиска:

manufacturer 
model 
number 

Проблема у меня в том, что люди должны иметь возможность искать (в любом порядке), каждый из этих столбцов ,

Теперь я использовал concat_ws('%20',manufacturer,model,number) like '%$q%', и это работает.

Давайте предположим, что у меня есть эти значения в моих DB столбцов (как сейчас, нет запятых и нет разделителя - они не являются имена в моем чтении DB, я упростил их как буквы здесь для простоты):

manufacturer: A B 
model: C D E 
number: F G H 

и я хочу найти:

A B C D F H //this doesn't work. 
A C F //this does work. 

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

Как я могу искать каждое слово в каждом столбце в любом порядке?

надеюсь, что этот вопрос достаточно ясен, пожалуйста, не стесняйтесь спрашивать более подробную информацию, если требуется.

Благодаря

+0

В чем причина использования concat? Вы можете сделать что-то вроде этого: 'производитель как '% string%' или модель типа '% string%' или number like '%%'' –

+0

Это было потому, что мне нужно было искать каждый столбец в любом возможном orfder , Я только что протестировал ваше предложение, но это тоже не сработает, потому что я получаю строку, содержащую номер модели производителя, и производитель, например, «% номер модели производителя%» пуст, так как я не в колонке производителя например – Nick

+0

Не могли бы вы разместить полный sql? –

ответ

0

Позабавившись с запросом немного, я в конечном итоге с этим рабочим раствором.

Я собираюсь написать его здесь, в случае, если это полезно для кого-то еще, а также:

$q = $_REQUEST['search']; 
$decoded = urldecode($q); 
$q_array = array_filter(explode(' ', str_replace('', ' ', $decoded))); 

$counter = 0; 
$searchTerms = ''; 

foreach ($q_array as $q) { 
    $counter++; 
    if ($counter == 1) { 
     $searchTerms .= "concat_ws(' ',manufacturer,model,number) like '%$q%'"; 
    } else { 
     $searchTerms .= "and concat_ws(' ',manufacturer,model,number) like '%$q%'"; 
    } 
} 



$first_query_part = "select manufacturer, model, number from table where ";  
$sql_res = $first_query_part . $searchTerms; 

И это работает.

В принципе, я разделяю каждое искомое слово, и я вставляю их в массив, затем подсчитываю слова и добавляю concat_ws(' ',manufacturer,model,number) like '%$q%'"; для каждого найденного слова.