创建搜索字段

时间:2013-10-04 18:22:20

标签: php mysql search

所以我在这个网站上工作,我刚刚添加了一个搜索按钮。 当我使用像

这样的简单搜索查询时,一切正常
SELECT `student_id` FROM `student` WHERE `username` LIKE 'jo%' OR `firstname` LIKE 'jo%' OR `lastname` LIKE 'jo%' OR `surname` LIKE 'jo%' OR `email` LIKE 'jo%' 

这将通过查看字段'username',firstname,lastname等返回名称与数据库中的john匹配的所有id。

然而,问题是,当用户在搜索参数之间插入一个空格(实际上这意味着他是用两个名字搜索学生)时,结果就是什么。

我认为这是因为它在每个字段中独立地寻找搜索参数(比如'john doe')。

我如何解决这个问题。

5 个答案:

答案 0 :(得分:2)

我不确定您希望如何处理这些内容,您可以将其添加到WHERE子句中,以便搜索firstname和lastname字段,并在它们之间留一个空格。

CONCAT(`firstname`, ' ', `lastname`) LIKE 'jo%'

或者您可能希望删除通配符并进行精确搜索。

CONCAT(`firstname`, ' ', `lastname`) = 'jo'

答案 1 :(得分:0)

如果你想跨多个列进行搜索/匹配,你真的需要研究MySQL的全文搜索功能。有关开始使用的文档,请参阅此链接:

http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

这比在一堆列中尝试LIKE要好得多。

答案 2 :(得分:0)

SELECT * FROM student 
    WHERE username LIKE REPLACE(username, ' ', '') = REPLACE("Twitt er", ' ', '')

答案 3 :(得分:0)

您可以假设存在空格意味着用户正在搜索名/姓的组合。 (实际上你的UI可以说明这一点。)

然后使用

$name = split(' ' , $incoming);

然后你创建一个条件检查$ name [1]是否存在,然后确定是否要搜索

$where_clause = WHERE firstname = $name[0] AND lastname = $name[1];

如果失败,请回到:

$where_clause = WHERE firstname = $name[0] 

$where_clause = WHERE lastname = $name[1] 

等等。

然后使用它:

SELECT `student_id` FROM `student` . $where_clause

这有些伪劣,但你得到了我希望的图片。

有更优雅的方式来实现这样的sql-builder,但我提供它作为一种说明如何开始思考它的方式 - “使用FULLTEXT”评论放在一边。

答案 4 :(得分:0)

有两种方法可以做到这一点:

1)正如你想要的那样

`

     $search_term= "Mike Brant";
      $term_part = preg_split('/ /', $search_term);
     /*
      term_part[0]=Mike
      term_part[1]=Brant
    */
     foreach($term_part as $value){
    $like. = " `username` LIKE '".$value."%' OR `firstname` LIKE '".$value."%' OR `lastname` LIKE '".$value."%' OR `surname` LIKE '".$value."%' OR `email` LIKE '".$value."%' OR "
    }
    $like = substr($like, 0, -3);
    $sql = "SELECT `student_id` FROM `student` WHERE ".$like.";
`

2)使用FULLTEXT搜索表引擎MYISAM    详细了解FULLText

FULLTEXT是搜索应用程序的最佳选择