2015-12-21 3 views
0

Это часть запроса, в котором он должен искать через утренние, дневные и вечерние столбцы в таблице сообщений.Как выполнить поиск по нескольким столбцам в mysql

$add_here .= " AND posts.".$col." IN ('" . implode("',' ",$days) . "')"; 

$ col - переменная, которая содержит массив или одно значение для имени столбца, предоставленного пользователем. А именно «утро», «день», «вечер». Вы знаете, как изменить запрос выше для поиска в массиве ($ col)?

Ниже указано, потому что я указал название столбца, которое является «днем». Интересно, как заменить текст «днем» на массив значений!

$add_here .= " AND posts.afternoon IN ('" . implode("',' ",$days) . "')"; 
+0

Вам нужно будет создать ряд Ored пунктов для проверки матчей. Но вопрос предполагает, что у вас есть столбец для каждого периода времени, который предлагает плохо нормализованную базу данных (и если нормализовать такой запрос, вероятно, будет намного проще) – Kickstart

ответ

1

Использование array_map построить ряд условий, сгруппированных с OR:

$days = ['sun','mon','tue']; 
$col = ['afternoon','morning','night']; 
$add_here = ''; 

$add_here .= sprintf(" AND (%s)", 
    implode(' OR ', array_map(
      function($colx) use ($days) { 
       return sprintf("posts.%s IN ('%s')", $colx, implode("','",$days)); 
      }, is_array($col) ? $col : array($col)) 
    ) 
); 

AND (posts.afternoon IN ('sun','mon','tue') OR posts.morning IN ('sun','mon','tue') OR posts.night IN ('sun','mon','tue'))

+0

У меня возникла ошибка: Warning: array_map(): Аргумент # 2 должен быть массив в ...., Предупреждение: implode(): Недопустимые аргументы переданы .... Каков вывод функции выше? – 112233

+0

$ col ожидается как массив. Может быть, вы используете его со струной? Если это так, просто преобразуйте его в массив с $ col = array ($ col), прежде чем называть это. – Amarnasan

+0

моя ошибка неправильно использовала имя переменной $ .. – 112233

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