2015-12-19 133 views
0

我已经使用具有LIKE子句的Query在两侧都使用%通配符实现了搜索。SQL使用LIKE搜索查询

我国家具有列名。如果我用P或PAK搜索它会显示结果但是如果我用'我住在巴基斯坦'搜索它,它不会比较。

我明白的事情是它与子字符串相匹配。

是否有可能使其反之亦然像我传递字符串“我住在巴基斯坦,并与字符相匹配的字段,并得到巴基斯坦的结果。

即时帮助将不胜感激。

+3

示例数据,所需结果和您尝试的查询将阐明您正在尝试执行的操作。 –

+0

我使用SELECT * FROM表WHERE country like'%Pak%' 它给了我正确的结果,并显示所有行有国家巴基斯坦 但我希望它搜索,而我与'我爱巴基斯坦'相比,因为这句子还包含巴基斯坦 –

回答

0

,你可以使用来自笨框架等等()函数。

$this->db->like(); 

该函数使您能够生成LIKE子句,这对于执行搜索很有用。

注:传递给这个函数的所有值都会自动转义。

简单的键/值方法: $ this-> db-> like('title','match');

// Produces: WHERE title LIKE '%match%' 

如果使用多个函数调用,他们将与它们之间被链接:

$this->db->like('title', 'match'); 
    $this->db->like('body', 'match'); 

    // WHERE title LIKE '%match%' AND body LIKE '%match% 

如果你想控制,其中通配符(%)放置,你可以使用可选的第三论据。您的选项是“之前”,“之后”和“两者”(这是默认设置)。

$this->db->like('title', 'match', 'before'); 
    // Produces: WHERE title LIKE '%match' 

    $this->db->like('title', 'match', 'after'); 
    // Produces: WHERE title LIKE 'match%' 

    $this->db->like('title', 'match', 'both'); 
    // Produces: WHERE title LIKE '%match%' 

如果你不想使用通配符(%),你可以传递给可选的第三个参数'none'。

$this->db->like('title', 'match', 'none'); 
    // Produces: WHERE title LIKE 'match' 

See This

我认为你需要做的是搜索和比较在提供的文本的每一句话,我认为这将是有益的。

$temp = array(); 
$str = array(); 
$str = explode(' ', $string); 
foreach ($str as $word) { 
    if (strlen($word) > 2) { 
     $this->db->or_like('country_name', $word, 'both'); 
    } else { 
     continue; 
    } 
} 
$countries = $this->db->get('countries'); 

我想在$国家,你将拥有所有需要的结果。

0

你可以用逗号代替空格,然后用find_in_set。假设你的字符串是$str,考虑这个查询:

SELECT * 
FROM countries c 
WHERE c.name LIKE '%$str%' OR 
     FIND_IN_SET(c.name, REPLACE($str, ' ', ',')) > 0 
+0

感谢您指出一个更多的功能。 :)问题:是否有方法来标记/避免在集合中使用1和2个字母的单词? – Tpojka

+0

@Tpojka不太清楚你的意思。你能否详细说明一下? – Mureinik

+0

如果您检查我提供的PHP解决方案,可以看到避免短的单词。例如''value =“我的代码'a'中的一个国家塞尔维亚''将会被避免,因为它可以在许多不想要的结果中找到。当然,对于国家表来说,因为它的内容是〜200个结果,所以并不是很需要,但是要求通用的mysql方式解决方案。 – Tpojka

0

试试这个

public function searchCountry($value) 
{ 
    $value = $value; 
    $query = $this->db->query("SELECT * FROM table_name WHERE country LIKE '%$value%' "); 
    $result = $query->result_array(); 
    return $result; 
} 
+0

@MudassirShah如果我的答案有帮助接受它 –

0

这可能是工作(免责声明:未测试):

public function searchCountry($value) 
{ 
    $sql = "SELECT DISTINCT FROM `countries`"; 

    $value = explode(' ', $value);// use all words from query 
    $first_match = FALSE; 
    foreach ($value as $k => $v) 
    { 
     if (strlen($v) >= 3)// exclude 1 and 2 letter words if want 
     { 
      if (! $first_match) 
      { 
       $sql .= " WHERE `name` LIKE %$v%"; 
      } 
      else 
      { 
       $sql .= " OR `name` LIKE %$v%"; 
      } 
     } 
    } 

    $sql .= " LIMIT 50"; 

    $query = $this->db->query($sql); 
    $result = $query->result_array(); 
    return $result; 
} 

但你也许应该使用@Mureinik解。

0

您可以使用正则表达式技巧为了这个目的:

where country regexp replace($str, ' ', '|') 

此构建表达:

where country regexp 'I|live|in|Pakistan' 

这是因为对正则表达式规则的计算结果为True。