当用户尝试搜索我们系统中的人时,我们注意到他们经常为搜索输入全名。
当名字和姓氏存储在不同的列中时,我们如何在我们的数据库上启用全名搜索?
答案 0 :(得分:1)
一个有效但不快速也不可靠的解决方案是:
SELECT foo
FROM bar
WHERE CONCAT(firstname, ' ', lastname) = $search_name
(不确定MySQL CONCAT语法atm,你可能需要连接两次)
这很可能不会使用任何索引,从而大大减慢了搜索速度。
更好的解决方案是分割名称:
$names = explode(' ', $search_name);
SELECT foo
FROM bar
WHERE firstname = $names[0]
AND lastname = $names[1]
更好:
提供两个输入框并将它们标记为名字和姓氏,以便用户正确输入搜索。
答案 1 :(得分:1)
更好 - 如果您正在使用CakePHP 1.3,那么只需创建一个'full_name'虚拟字段。对该字段进行查询。
http://book.cakephp.org/view/1609/Creating-virtual-fields
http://book.cakephp.org/view/1610/Using-virtual-fields
class User extends AppModel {
...
var $virtualFields = array(
'full_name' => 'CONCAT( User.first_name, " ", User.last_name )'
);
...
}
由于Cake将虚拟字段视为主模型的常规字段,因此您只需执行此类查找即可。
$User->find( 'all', array(
'conditions' => array(
'User.full_name' => $search_name
...
),
...
);
你甚至可以在条件
中抛出一些MySQL LIKE善良$User->find( 'all', array(
'conditions' => array(
'User.full_name LIKE' => '%' . $search_name . '%',
...
),
...
);
这种语法意味着最终用户可以将第一部分,最后一部分或全部名称的一部分放入搜索字段中,并且仍然可以获得结果而无需担心代码是在第一个,最后一个还是两个都找到了。< / p>
答案 2 :(得分:0)
您99%的情况可能是这样的:
根据系统中的用户数量以及他们名称的“创造性”,您可能会从这种方法中得到一些误报。
您还可以考虑向用户提供单独的字段。
答案 3 :(得分:0)
如何搜索数据库中的人员?
如果您有SQL查询,可以这样做:
将搜索文本分隔为参数。所以你在2个独立的参数中有名字和姓氏。 (Stackoverflow: How to split a string in php)
然后您可以使用不同的参数来构建符合您需求的查询:
select *
from People
where
(firstname LIKE param1 AND lastname LIKE param2) OR
(firstname LIKE param2 AND lastname LIKE param1) OR ...
答案 4 :(得分:0)
您可以在first_name和last_name上设置单个全文索引。然后,只包括MATCH(first_name,last_name)AGAINST($ query)的测试。或者,如果您不仅要搜索该字段,还要将其添加到索引中。
让SQL为您完成工作。