【问题标题】:Search with full name instead of just first name or last name使用全名而不是名字或姓氏进行搜索
【发布时间】:2011-09-08 14:25:34
【问题描述】:

我正在开发一个使用 PHP 和 Codeigniter 构建的 API,并使用 MySQL 作为数据库。

我有一个名为 Users 的用户表,其中包含以下列:

- ID
- Firstname
- Lastname
- Email

用户如何使用全名搜索此表?例如,搜索 Martin 或 Smith 时效果很好,但不是 Martin Smith。

这是我现在使用的查询:

$this->db->select('*');
$this->db->from('users');
$this->db->like('firstname', $args['query']);
$this->db->or_like('lastname', $args['query']);

更新

如果我按照下面的建议使用此查询,我将找不到任何东西。没有全名、名字或姓氏。那么名字和姓氏必须是同一个词。

$this->db->select('*');
$this->db->from('users');
$this->db->like('firstname', $args['query']);
$this->db->like('lastname', $args['query']);

【问题讨论】:

  • 为什么不起作用?你期望什么,反而会发生什么。

标签: php sql codeigniter


【解决方案1】:

我一时想不通,但是呢

$input = 'Martin Smith';

$names = explode($input);

$this->db->select('*'); 
$this->db->from('users'); 
$this->db->where_in('firstname', $names); 
$this->db->or_where_in('lastname', $names);

应该输出类似:

SELECT * FROM users 
WHERE firstname IN ('Martin', 'Smith') 
OR lastname IN ('Martin', 'Smith')

【讨论】:

  • 好主意,但我不会使用 Abraham van Helsing 或 Jonathan Parker Bowles 这样的名字。
  • +1 用于名称参考。也许不是最灵活的解决方案,但:SELECT * FROM users WHERE CONCAT_WS(' ', firstname, lastname) = "$input_firstname $input_lastname";
【解决方案2】:

试试:

$this->db->select('*');
$this->db->from('users');
$this->db->like('firstname', $args['first_name']);
$this->db->like('lastname', $args['last_name']);

这会导致:

Select * from users
WHERE firstname LIKE '%first_name%' 
AND lastname LIKE '%last_name%

【讨论】:

  • 好吧,如果我这样做,搜索将不起作用。请查看更新。
  • 问题是,如果我搜索“martin smith”,它将找不到任何东西,也找不到 martin,因为它正在寻找一个名字为 martin 和姓氏为 martin 的用户。
  • 你能把代表实际使用的参数的完整功能和值吗?
【解决方案3】:

更改:$this->db->or_like('lastname', $args['query']);

收件人:$this->db->like('lastname', $args['query']);

【讨论】:

  • 好吧,如果我这样做,搜索将不起作用。请查看更新。
  • 错过了,你应该使用'query1'和'query2'或类似的东西......否则它将使用相同的参数来搜索两个字段..
【解决方案4】:

您需要将 OR 更改为 AND:

SELECT * FROM users WHERE Firstname = '$firstname' AND Lastname = '$lastname'

【讨论】:

  • 好吧,如果我这样做,搜索将不起作用。请查看更新。
  • 好的,我编辑了它。注意:MySql 是区分大小写的,你说你的列被命名为 Firstname、Lastname、Email 但在你的查询中你像 firstname 和 lastname 一样使用它们
【解决方案5】:

我正在这样做并且工作正常:

$terms = explode(' ', $searchtxtusername); 
if(count($terms)>1){
    $this->db->like('u.first_name', $this->db->escape_like_str($terms[0]));
    $this->db->like('u.last_name', $this->db->escape_like_str($terms[1]));
}else{
    $this->db->like('u.first_name', $this->db->escape_like_str($terms[0]));
    $this->db->or_like('u.last_name', $this->db->escape_like_str($terms[0]));
}

这里,$searchtxtusername 是搜索词,包括名字和姓氏(空格分隔)。如果只有一个词,那么它会检查同一个词的名字和姓氏。

例子:如果我搜索 Bob,那么搜索条件是这样的:

first_name LIKE '%Bob%' 
AND last_name LIKE '%Bob%'

如果我搜索 Bob Beggins,那么搜索条件变为:

first_name LIKE '%Bob%' 
AND last_name LIKE '%Beggins%'

【讨论】:

    【解决方案6】:
    if($data['keyword'] != ''){
       $this->db->like('CONCAT(First_Name, " ", Last_Name," ")', $data['keyword']);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多