我想问一下我面临的问题。
我在1列中保存了全名,例如:" John Doe"。
但是在进行搜索时例如:
SELECT * FROM client WHERE name LIKE '%Doe John%';
结果: 0行。
如果我切换到数据库中的完全匹配商店,它会找到一行。
SELECT * FROM client WHERE name LIKE '%John Doe%';
结果: 1行。
我的问题是,如何在不采用单词顺序的情况下搜索数据库。
在OOP框架中,代码是:
$like = 'Doe John';
$this->db->select('*')->from('client')->like('name', $like)->get();
我也对此进行了测试,但结果相同:
$this->db->select('*')->from('client');
if($this->containTwoWords($like)) {
$explode = explode(' ', $like);
foreach($explode as $exploded){
$this->db->like('name', $exploded);
}
} else {
$this->db->like('name', $like);
}
$this->db->get();
function containTwoWords($like){
if(strpos($like, ' ') !== false) {
return true;
}
return false;
}
如果有人通过这个并且有更好的解决方案,我很感激分享!。
答案 0 :(得分:1)
您的示例案例的一个选项是分别检查名字和姓氏:
SELECT * FROM client WHERE name LIKE '%Doe%' AND name LIKE '%John%'
如果您使用LIKE
运算符已经用尽了这些技巧,那么您可以考虑使用MySQL的全文搜索功能。
答案 1 :(得分:1)
尝试这样的事情:
<?php
$search_term = 'john doe abc';
$keywords = explode(" ", preg_replace("/\s+/", " ", $search_term));
foreach($keywords as $keyword){
$wherelike[] = " name LIKE '%$keyword%' ";
}
$where = implode(" and ", $wherelike);
$query = "select * from client where $where";
echo $query;
//select * from client where name LIKE '%john%' and name LIKE '%doe%' and name LIKE '%abc%'
?>
答案 2 :(得分:0)
试试这个name like '%John%' and name like '%Doe%'
答案 3 :(得分:0)
如果你想将$ like变量分解为名/姓(并且你总是希望有2个名字,用空格分隔),那么这应该适合你。
PHP具有内置的explode()方法,可以完全按照您的要求进行操作。
$like = "John Doe";
$name = explode(" ", $like);
// This created a 0-based array, meaning the first item as split
// by the space between John and Doe is given the array index of 0.
// $name[0] = John
// $name[1] = Doe
因此在MySQL的实践中可以用作以下内容:
$query = "SELECT * FROM client WHERE name LIKE '%" . $name[0] . "%' AND name LIKE '%" . $name[1] . "%'";
有关explode()函数的更多信息,请查看PHP手册:http://php.net/manual/en/function.explode.php
希望这有帮助!