2011-09-08 112 views
2

我正在开发一个使用PHP和Codeigniter构建的API,我使用MySQL作为数据库。用全名搜索而不是名字或姓氏

我有一个用户表称为用户,包含以下几列:

- 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']); 
+1

为什么犯规工作?你期望什么,取而代之的是什么。 – TJHeuvel

回答

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') 
+0

好主意,但我不会像亚伯拉罕范海辛或乔纳森·帕克·鲍尔斯名工作。 –

+0

+1以供参考。也许不是最灵活的解决方案,但:'SELECT * FROM用户WHERE CONCAT_WS(””,名字,姓氏)= “$ input_firstname $ input_lastname”;' – danneth

1

尝试:

$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% 
+0

那么,如果我这样做,搜索不起作用。请参阅更新。 –

+0

我希望现在更清楚 –

+0

问题是,如果我搜索“martin smith”,它不会找到任何东西,不会与martin一起找到任何东西,因为它正在寻找一个名字为martin和姓氏martin的用户。 –

0

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

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

+0

那么,如果我这样做,搜索不起作用。请参阅更新。 –

+0

小姐,你应该使用“QUERY1”和“QUERY2”或类似的东西......否则将使用相同的参数来搜索这两个领域.. –

0

您需要CH安格那或为AND:

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

好吧,如果我这样做了搜索无法正常工作。请参阅更新。 –

+1

好吧,我编辑它。 注:MySQL是大小写敏感的,你说你的列被命名为名字,姓氏,电子邮件,但在查询中使用的是他们像名字和姓氏 –

0

我这样做和工作的罚款me:

$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])); 
} 

这里,$ s earchtxtusername是包含名字和姓氏(空格分隔)的搜索术语。如果只有一个术语,那么它会检查名字和姓氏的相同术语。

例如:如果我搜索了鲍勃,然后搜索条件是这样的:

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

,如果我搜索鲍勃Beggins,然后搜索条件为:

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