Как фильтровать по нескольким полям в MySQL / PHP - PullRequest
0 голосов
/ 14 ноября 2011

Я сейчас пишу функцию фильтра / сортировки для приложения, в котором над каждым столбцом будут текстовые поля.Когда пользователь вводит данные в каждое поле, запросы будут отправляться на сервер для сортировки.Поскольку будет около 6 текстовых полей, мне было интересно, есть ли лучший способ сортировки вместо использования операторов if для проверки каждой переменной и написания конкретных запросов, если, скажем, введены все поля, только одно или только дваи т. д.

Похоже, будет много операторов if.Есть ли более интуитивный способ сделать это?

Спасибо!

Ответы [ 5 ]

3 голосов
/ 14 ноября 2011

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

Поместите туда условие ORDER BY, если только у вас нет особых причин для выполнения сортировки в самом приложении.


Редактировать: Теперь вы говорите, что хотите отфильтровать данные. Я все еще делал бы это на уровне базы данных. Не имеет смысла посылать огромный набор данных в PHP, просто для того, чтобы PHP пришлось пробираться через него и отфильтровывать там данные. В большинстве случаев выполнение этого в MySQL будет гораздо более эффективным, чем то, что вы можете построить в PHP.

0 голосов
/ 14 ноября 2011

Поскольку будет около 6 текстовых полей, мне было интересно, есть ли лучший способ сортировки вместо использования операторов if для проверки каждой переменной

Определенно НЕТ.

Во-первых, нет ничего плохого в использовании нескольких if в порядке.
Поверьте мне, я сам большой поклонник сокращения повторений кода, но считаю, что эти блоки, написанные вручную, являются лучшим решением.
Далее, хотя может быть способ обернуть эти условия в некоторый цикл, в большинстве случаев разные состояния требуют различного лечения.

однако, в ваших следующих утверждениях вы ошибаетесь:

и написание конкретных запросов

вам нужен только один запрос

Похоже, было бы много операторов if.

почему? не более, чем количество полей у вас есть.

Здесь приведен полный пример кода создания пользовательского поискового запроса:

$w     = array();
$where = '';

if (!empty($_GET['rooms']))     $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space']))     $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where"; 

единственные поля, заполненные пользователем, идущие на запрос.

порядок будет примерно таким же.

  • mesc - это аббревиатура для mysql_real_escape_string или любой другой применимой для базы данных функции экранирования строк
0 голосов
/ 14 ноября 2011

Не могли бы вы взглянуть на это?

WHERE (ifnull(@filter1, 1) = 1 or columnFilter1 = @filter1)
  and (ifnull(@filter2, 1) = 1 or columnFilter2 = @filter2)
  and (ifnull(@filter3, 1) = 1 or columnFilter3 = @filter3)
  and (ifnull(@filter4, 1) = 1 or columnFilter4 = @filter4)
  and (ifnull(@filter5, 1) = 1 or columnFilter5 = @filter5)
  and (ifnull(@filter6, 1) = 1 or columnFilter6 = @filter6)

Пожалуйста, дайте мне знать, если я неправильно понимаю ваш вопрос. Это не похоже на пакет операторов IF, и это довольно долго, но что выдумаю

0 голосов
/ 14 ноября 2011

Нет. Вы не можете избежать операций тестирования при сортировке набора, так как вы должны сравнивать элементы в наборе таким же образом. Транспортным средством для этого является утверждение if.

0 голосов
/ 14 ноября 2011
select * from Users

order by Creadted desc, Name asc, LastName desc, Status asc

И ваши записи будут отсортированы по порядку из запроса.

Сначала по Creed desc, а затем по Name asc и т.вы ищете для фильтрации результатов.

Таким образом, чтобы отфильтровать по нескольким полям, просто добавьте ваше где, или, если вы используете какой-либо ORM, вы можете сделать это с помощью методов объекта.может сделать это следующим образом

$query = "";
foreach($_POST['grid_fields'] as $key => $value)
{
   if(strlen($query) > 0)
         $query .= ' and '
   $query .= sprintf(" %s LIKE '%s' ", mysql_real_escape_string($key), '%' .mysql_real_escape_string($value) .'%');  
}
if(strlen($query) > 0)
   $original_query .= ' where ' . $query;

это может помочь вам достичь вашего результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...