Mysql搜索喜欢2个单词的顺序

时间:2016-11-01 16:03:30

标签: php mysql

我想问一下我面临的问题。

我在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;
}

如果有人通过这个并且有更好的解决方案,我很感激分享!。

4 个答案:

答案 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

希望这有帮助!