Как я могу установить разные ограничения на разные столбцы в одном запросе в SQL, Codeigniter? - PullRequest
0 голосов
/ 03 октября 2018

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

У меня есть эта таблица

id address        city      zipcode  state  country
1  12, street     arizona   1234     abcd   new island
2  abcd,stree     abcd      7895     abcd   us
3  new av         mumbai    6875     abcd   uk
4  abcd, street   test ci   5687     abcd   new island
5  6741, street   df df     12345    abcd   uae

Что мне нужно, если кто-то ищет, скажем "abcd"«Я хочу, чтобы результаты отображались следующим образом:

5 адрес, который соответствует« abcd »

и 1 для каждого из города, почтового индекса, штата и страны

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

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

 $query = $this->db->query("SELECT city FROM ".$this->db->dbprefix('prison')." WHERE city like'%".$keyword."%' LIMIT 1");
    $query2 = $this->db->query("SELECT zipcode FROM ".$this->db->dbprefix('prison')." WHERE zipcode like'%".$keyword."%' LIMIT 1");
    $query3 = $this->db->query("SELECT state FROM ".$this->db->dbprefix('prison')." WHERE state like'%".$keyword."%' LIMIT 1");
    $query4 = $this->db->query("SELECT address FROM ".$this->db->dbprefix('prison')." WHERE address like'%".$keyword."%' LIMIT 10");
    $query5 = $this->db->query("SELECT country FROM ".$this->db->dbprefix('prison')." WHERE country like'%".$keyword."%' LIMIT 1");

    $result_array = [];
    $result_array['cities'] =  $query->row();
    $result_array['zipcode'] =  $query2->row();
    $result_array['state'] =  $query3->row();
    $result_array['address'] =  $query4->result();
    $result_array['country'] =  $query5->row();

    return $result_array;

Есть ли в любом случае я могу добиться этого в одном запросе?также возможно ли это решение, я показываю результат через ajax при keyup, так что я обеспокоен тем, что выполнение нескольких запросов повлияет на время загрузки результата.

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

  $query = $this->db->query("SELECT prison_city FROM ".$this->db->dbprefix('prison')." WHERE prison_city like'%".$keyword."%' LIMIT 1 UNION SELECT prison_zipcode FROM ".$this->db->dbprefix('prison')." WHERE prison_zipcode like'%".$keyword."%' LIMIT 1 UNION SELECT prison_state FROM ".$this->db->dbprefix('prison')." WHERE prison_state like'%".$keyword."%' LIMIT 1 UNION SELECT prison_country FROM ".$this->db->dbprefix('prison')." WHERE prison_country like'%".$keyword."%' LIMIT 1 UNION SELECT prison_address FROM ".$this->db->dbprefix('prison')." WHERE prison_address like'%".$keyword."%' LIMIT 10");


    return $query->result();

, он выводит эти данные

Array ( 
  [0] => stdClass Object ( [prison_city] => Susanville ) 
  [1] => stdClass Object ( [prison_city] => California ) 
  [2] => stdClass Object ( [prison_city] => 24900 CA-202 ) 
  [3] => stdClass Object ( [prison_city] => New York, America ) 
  [4] => stdClass Object ( [prison_city] => 1 Kings Way, Avenal, CA 93204, USA ) 
  [5] => stdClass Object ( [prison_city] => 14901 Central Ave ) 
  [6] => stdClass Object ( [prison_city] => 19025 Wiley's Well Road ) 
  [7] => stdClass Object ( [prison_city] => 23500 Kasson Rd ) 
  [8] => stdClass Object ( [prison_city] => 475-750 Rice Canyon Rd ) 
  [9] => stdClass Object ( [prison_city] => 19005 Wiley's Well Road ) 
)

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

1 Ответ

0 голосов
/ 03 октября 2018

вы можете использовать объединение с пользовательским значением.Например: -

    SELECT * FROM (SELECT prison_city , 1 AS type FROM ".$this->db->dbprefix('prison')." WHERE prison_city like'%".$keyword."%' LIMIT 1
   ) tb1  UNION (SELECT prison_zipcode ,2 FROM ".$this->db->dbprefix('prison')." WHERE prison_zipcode like'%".$keyword."%' LIMIT 1) 
    UNION (SELECT prison_state,3 FROM ".$this->db->dbprefix('prison')." WHERE prison_state like'%".$keyword."%' LIMIT 1) 
    UNION (SELECT prison_country,4 FROM ".$this->db->dbprefix('prison')." WHERE prison_country like'%".$keyword."%' LIMIT 1) 
    UNION (SELECT prison_address,5 FROM ".$this->db->dbprefix('prison')." WHERE prison_address like'%".$keyword."%' LIMIT 10) 

И использовать набор подзапросов для отдельных предложений LIMIT.

Это рабочая скрипка.

http://sqlfiddle.com/#!9/a6c585/74700

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