使用LIKE的SQL搜索查询


SQL Searching Query using LIKE

我已经使用查询实现了搜索,查询中有LIKE子句,两边都有%通配符。

我有一个列有国家名称的专栏。如果我用P或PAK搜索,它会显示结果,但如果我用"我住在巴基斯坦"搜索,它不会比较。

我理解的是它与子字符串匹配。

有没有可能让它反过来,就像我传递字符串"我住在巴基斯坦"一样,它与字段中的字符匹配,得到巴基斯坦的结果。

如能提供即时帮助,不胜感激。

您可以使用codeigniter框架中的like()函数。

$this->db->like();

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

注意:传递给此函数的所有值都是自动转义的。

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

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

如果你使用多个函数调用,它们将被链接在一起,它们之间有AND:

    $this->db->like('title', 'match');
    $this->db->like('body', 'match');
    // WHERE title LIKE '%match%' AND body LIKE '%match%

如果要控制通配符(%)的位置,可以使用可选的第三个参数。您的选项为"before"、"after"answers"both"(默认值)。

    $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' 

请参阅此

我认为你需要的是搜索和比较提供的文本中的每个单词,我认为这会很有帮助。

$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');

我认为在$国家,你会得到所有需要的结果。

您可以用逗号替换空白,然后使用find_in_set。假设您的字符串是$str,请考虑以下查询:

SELECT *
FROM   countries c
WHERE  c.name LIKE '%$str%' OR
       FIND_IN_SET(c.name, REPLACE($str, ' ', ',')) > 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;
}

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

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解决方案。

您可以为此使用正则表达式技巧:

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

这构建了表达式:

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

由于正则表达式的规则,计算结果为true。