Intereting Posts
Существует ли рациональное объяснение этого поведения PHP по поведению? Или PHP ошибка? несколько флажков с php в таблице Как отображать месяцы в полном тексте для полей «Дата» в Symfony2? Неопределенное свойство: Illuminate \ Database \ Eloquent \ Collection :: Laravel 5.2 Как сгенерировать json с помощью php? SQLSTATE Нет такого файла или каталога Переменная сеанса не сохраняется при перенаправлении в laravel добавьте класс в определенную строку в codeigniter, используя класс таблицы Создание 14-символьного генератора случайных ключей Как передать переменную javascript из php обратно в javascript Бесконечное соответствие подвыражений (регулярных выражений) возвращает только одно совпадение Regex для замены <p class = "someClass"> тегом <h2>? POST для PHP с событиями, отправленными сервером? как получить последний вставленный идентификатор базы данных Sqlite с использованием Zend_Db Google reCaptcha говорит: invalid-request-cookie

Запрос для PHP / MySql AND / OR для расширенного поиска

Я новичок в php и mysql, поэтому мне нужна помощь с моим запросом. Это мой запрос sql

SELECT * FROM table1 WHERE (Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%') AND Category LIKE '$category' AND Country LIKE '$country' LIMIT $start, $limit 

Теперь то, что я хочу сделать, это

  1. Этот запрос должен искать имена столбцов с именем или ZipCode, используя текстовое поле с ключевым словом name. Это либо ключевое слово соответствует столбцу Name, либо ZipCode.
  2. Запрос также должен работать, если ни одно ключевое слово не введено, и из раскрывающегося списка выбрана только страна.
  3. Запрос также должен работать, если ни одно ключевое слово или страна не введено, и из раскрывающегося списка выбрана только категория.

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

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

 $query = ""; $keyword = $_REQUEST['keyword']; $country = $_REQUEST['country']; $category = $_REQUEST['category']; if(isset($keyword)){//if keyword set goes here $query = "SELECT * FROM table1 WHERE Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR country LIKE '%$keyword%'"; if(isset($category)){ $query .= "AND category LIKE '$category'"; } if(isset($country)){ $query . = "AND country LIKE '$country'" } }else if (isset($category)){ //if keyword not set but category set then goes here $query = "SELECT * FROM table1 WHERE category LIKE '$category'"; if(isset($country)){ $query . = "AND country LIKE '$country'"; } }else if(isset($country)){//if only country set goes here $query = "SELECT * FROM table1 WHERE country LIKE '$country'" } 

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

Обратите внимание, что использование типа, начинающегося с%, вероятно, будет довольно медленным.

Если вы действительно хотели сделать это как одно утверждение (и я не рекомендую его), то:

 SELECT * FROM table1 WHERE (Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR '$keyword' = '') AND (Category = '$category' OR '$category' = '' ) AND (Country = '$country' OR '$country' = '' ) LIMIT $start, $limit 

Или динамически наращивать его

 $ConditionArray = array(); if ($keyword != '') $ConditionArray[] = "(Name LIKE '%$keyword%' OR ZipCode LIKE '%$keyword%' OR '$keyword' = '')"; if ($category != '') $ConditionArray[] = "Category = '$category'"; if ($country != '') $ConditionArray[] = "Country = '$country'"; if (count($ConditionArray) > 0) { $query = " SELECT * FROM table 1 WHERE ".implode(' AND ', $ConditionArray); }