[英]SQL Searching Query using LIKE
我已经实现了使用带有LIKE子句且两侧都带有%通配符的Query进行搜索。
我的栏中有国家名称。 如果我使用P或PAK进行搜索,则会显示结果,但是如果我使用“我住在巴基斯坦”进行搜索,则不会进行比较。
我了解的是它与子字符串匹配。
是否有可能使它相反,就像我传递字符串“我住在巴基斯坦”并且它与字段中的字符匹配并得到巴基斯坦的结果一样。
即时帮助将不胜感激。
您可以用逗号替换空格,然后使用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解决方案。
您可以使用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%
如果要控制通配符(%)的放置位置,则可以使用可选的第三个参数。 您的选项为“之前”,“之后”和“两者”(默认设置)。
$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');
我认为在$ countries中,您将获得所有需要的结果。
您可以为此使用正则表达式技巧:
where country regexp replace($str, ' ', '|')
这将构造表达式:
where country regexp 'I|live|in|Pakistan'
由于正则表达式的规则,其求值结果为true。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.