如何避免将搜索查询分开以搜索MySQL数据库?

时间:2010-08-12 14:21:04

标签: php mysql search cakephp

当用户尝试搜索我们系统中的人时,我们注意到他们经常为搜索输入全名。
当名字和姓氏存储在不同的列中时,我们如何在我们的数据库上启用全名搜索?

5 个答案:

答案 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%的情况可能是这样的:

  1. 第一个空格
  2. 上拆分字符串
  3. 假设第一部分是名字,第二部分是姓氏
  4. 根据系统中的用户数量以及他们名称的“创造性”,您可能会从这种方法中得到一些误报。

    您还可以考虑向用户提供单独的字段。

答案 3 :(得分:0)

如何搜索数据库中的人员?

如果您有SQL查询,可以这样做:

  1. 将搜索文本分隔为参数。所以你在2个独立的参数中有名字和姓氏。 (Stackoverflow: How to split a string in php

  2. 然后您可以使用不同的参数来构建符合您需求的查询:

    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为您完成工作。