代码之家  ›  专栏  ›  技术社区  ›  Azam

MySql REGEXP通过包含特定单词搜索多个单词

  •  0
  • Azam  · 技术社区  · 7 年前

    我有一个包含关键字Column的数据库

    需要根据用户所做的查询搜索数据库。

    每个关键字的末尾都有“outlet”一词,但用户只会搜索“gul ahmad”,而不会搜索“gul ahmad outlet”。为此,我使用了以下查询,结果很好,找到了完整的结果“Gul Ahmad Outlet”

    $sql = "SELECT keywords FROM table WHERE keywords REGEXP '([[:blank:][:punct:]]|^)$keyword([[:blank:][:punct:]]|$)'";
    

    现在我有两个问题 1、如果单词“outlet”位于查询词之间,则找不到该单词。例如,如果用户搜索“kohistan lahore”,则数据库有一个名为“kohistan outlet lahore”的outlet,但它在数据库中找不到关键字并返回空。如何告诉数据库在两者之间、在开始或结束处包含“outlet”,以查找和匹配结果。

    1. 如果某个用户搜索“nabeel’s outlet”数据库时发现它,但由于“'”的原因,此查询返回空值,没有任何结果。
    2 回复  |  直到 7 年前
        1
  •  1
  •   Udit Solanki    7 年前

    您可以做的是,只需第一个单词就可以匹配列值 您的搜索表达式(即nabeel的出口)。我相信这样你就能涵盖你所有的场景。

    select 
          * 
    from `outlets` 
        where REPLACE(`name`,'\'','') regexp SUBSTRING_INDEX('nabeels outlet', ' ', 1)
    

    看看这把小提琴,测试一下自己: http://sqlfiddle.com/#!9/b3000/21

    希望有帮助。

        2
  •  0
  •   Rick James diyism    6 年前

    更简单: [[:<:]]$keyword[[:>:]] --这将检查“单词边界”,而不是空格、标点或字符串的开始/结束。和 $keyword = "nabeel's" 应该不是问题。

    难道你不想总是抓住“出口”?

    REGEXP "[[:<:]]$keyword[[:>:]] outlet"
    

    还有,是的,你 必须 转义某些内容,例如将用于引用regex字符串的引号。PHP的 addslashes() 是一种方式。