【问题标题】:Creating a search field创建搜索字段
【发布时间】:2013-10-04 18:22:19
【问题描述】:

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

这样的简单搜索查询时,一切正常
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%' 

这将通过查看“用户名”、名字、姓氏等字段从数据库中返回名称与 john 匹配的所有 id。

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

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

我该如何解决这个问题。

【问题讨论】:

标签: php mysql search


【解决方案1】:

我不确定你想如何处理这些,你可以将它添加到你的 WHERE 子句中,以搜索名字和姓氏字段,它们之间有一个空格。

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

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

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

【讨论】:

  • 谢谢 Tom 和 Marc B,让我试试这两个选项,看看结果如何
【解决方案2】:

如果您想跨多个列进行搜索/匹配,您确实需要研究 MySQL 全文搜索功能。请参阅此链接以获取帮助您入门的文档:

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

这将比尝试在一堆列中 LIKE 更好地扩展。

【讨论】:

  • 全文方式是否意味着我必须回到我的数据库结构的设计?
  • @JohnKariuki 是的。至少关于列上的索引。它还需要您使用 MyISAM 作为表的存储引擎,因此如果您当前拥有 InnoDB 表并依赖特定的 InnoDB 功能,您可能需要更彻底地重新考虑您的架构。
【解决方案3】:
SELECT * FROM student 
    WHERE username LIKE REPLACE(username, ' ', '') = REPLACE("Twitt er", ' ', '')

【讨论】:

    【解决方案4】:

    您可以假设空格的存在意味着用户正在搜索名字/姓氏组合。 (实际上你的 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”cmets。

    【讨论】:

      【解决方案5】:

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

      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 搜索表引擎 MISAM 详细了解FULLText

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        • 2017-10-31
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多