【问题标题】:MySQL - How to search for exact word match using LIKE?MySQL - 如何使用 LIKE 搜索精确的单词匹配?
【发布时间】:2011-08-10 05:36:51
【问题描述】:

我正在使用这个查询来选择数据:

mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'");

唯一的问题是,它有时会选择比我想要的更多。

例如,我想选择产品“BLA”,但我的查询也选择了产品“BLABLA”。需要明确的是,如果我想选择“产品 1”,我不希望查询选择“产品 11”。

有人知道如何管理吗?

谢谢。

【问题讨论】:

  • 嗯,这就是你使用LIKE的预期结果,尝试使用=
  • 好吧,我没有表达清楚,product_name 列包含更多的单词,而不仅仅是product_name 本身。例如,可能有“Bla - 50g”、“Bla - 10g”、“Bla - 5g”之类的东西,我想选择所有“Bla's”,而不是“Blabla's”。

标签: mysql select sql-like


【解决方案1】:

您只想搜索单词边界吗?如果是这样,粗略的版本可能是:

SELECT * FROM products WHERE product_name LIKE "% foo %";

或者你可以更聪明一点,用下面的REGEXP寻找单词边界

SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";

【讨论】:

  • 我觉得第一个效果不好,想想如果'foo'值!
  • 使用 RLIKE 的缺点是:“REGEXP 和 RLIKE 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会在使用多字节字符集时产生意想不到的结果。此外,这些运算符比较即使给定的排序规则将它们视为相等,按字节值和重音字符进行比较的字符也可能不相等。”
  • 太好了,对我很有帮助,非常感谢
【解决方案2】:

在谷歌上发现了这个问题,所以我认为有些人可能仍然会偶然发现这个问题,所以这是我非常不雅的尝试:

SELECT * FROM products
WHERE product_name LIKE 'BLA %' #First word proceeded by more words
OR WHERE product_name LIKE '% BLA' #Last word preceded by other words
OR WHERE product_name LIKE '% BLA %' #Word in between other words
OR WHERE product_name = 'BLA'; #Just the word itself

不确定效率或是否涵盖所有情况,因此如果这确实效率低下或太不优雅,请随意投反对票。

【讨论】:

  • 我也有同样的问题,而且想多了。这很好用。简单、易读、性能好。不需要正则表达式。
  • BLA 怎么样?或 BLA!或 BLA、bla bla 或“bla–”...
【解决方案3】:

尝试使用正则表达式:

SELECT 
    *
FROM
    `products`
WHERE
    product_name regexp '(^|[[:space:]])BLA([[:space:]]|$)';

【讨论】:

    【解决方案4】:
    SELECT  *
    FROM    products
    WHERE   product_name = 'BLA'
    

    将选择准确的BLA

    SELECT  *
    FROM    products
    WHERE   product_name LIKE 'BLA%'
    

    将选择BLADDERBLACKBERRY,但不选择REBLAND

    要选择BLA 作为字符串的第一个单词,请使用:

    SELECT  *
    FROM    products
    WHERE   product_name RLIKE '^Bla[[:>::]]'
            AND product_name LIKE 'Bla%'
    

    如果您在product_name 上有索引,则第二个条件可能会提高您的查询性能。

    【讨论】:

    • 好吧,我没有表达清楚,product_name 列包含更多的单词,而不仅仅是product_name 本身。例如,可能有“Bla - 50g”、“Bla - 10g”、“Bla - 5g”之类的东西,我想选择所有“Bla's”,而不是“Blabla's”。
    【解决方案5】:

    那么不要使用 LIKE,而是搜索相等性。

    即。

    mysql_query("SELECT * FROM products WHERE product_name = '".$search."'");
    

    顺便说一句,我希望您在查询中使用 $search 之前对其进行清理/转义。

    【讨论】:

      【解决方案6】:

      删除LIKE关键字并使用=进行精确匹配

      编辑

      不要忘记使用mysql_real_escape_string 转义用户输入,否则如果有人在输入框中输入引号,您的查询将失败。

      $search=mysql_real_escape_string($search);
      mysql_query("SELECT * FROM products WHERE product_name='".$search."'");
      

      【讨论】:

        【解决方案7】:

        使用等于 (=)?

        mysql_query("SELECT * FROM products WHERE product_name = '".$search."'"); 
        

        如果您要匹配 EXACT 字词,请不要使用 LIKE

        编辑:那让事情变得更清楚了。只需在搜索词后添加一个空格即可。或者,如果始终在搜索词中,甚至添加连字符 (-)。

        mysql_query("SELECT * FROM products WHERE product_name LIKE '".$search." -%'"); 
        

        【讨论】:

        • 好吧,我没有表达清楚,product_name 列包含更多的单词,而不仅仅是product_name 本身。例如,可能有“Bla - 50g”、“Bla - 10g”、“Bla - 5g”之类的东西,我想选择所有“Bla's”,而不是“Blabla's”。
        • 好吧,绝对可以有任何东西,所以那是行不通的。 =/
        • 你的意思是什么都可能有?!如果您在谈论连字符 (-),只需将其删除并留出空格即可。这只会匹配以“Bla”开头的单词,因此不会选择“Blabla”,而是会选择“Bla -”或“Bla Bla”。我只添加了连字符 (-),因为您提供的示例都有连字符。
        【解决方案8】:

        尝试在查询中使用正则表达式

        mysql_query("SELECT * FROM products WHERE product_name regexp '".$search."'");
        

        【讨论】:

          【解决方案9】:

          如果你想使用 LIKE 从 MySql 中搜索精确匹配的单词,那么你可以使用:

          SELECT * FROM tableName WHERE columnName LIKE 'your_query' ; 
          

          【讨论】:

            【解决方案10】:

            在 Laravel Eloquent 中,您可以像下面这样操作。

            Category::where('name', 'RLIKE ', "[[:<:]]"$words"[[:>:]]");
            

            在原始查询中,您可以这样搜索。

            SELECT * FROM categories WHERE name RLIKE "[[:<:]]categoryNameHere[[:>:]]";
            

            【讨论】:

              【解决方案11】:

              你可以像这样使用 select 查询,我也在 cakePHP 中使用,它很有帮助。

              Select * from `users` where username COLLATE latin1_general_cs LIKE '%$email%'
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-02-14
                • 2011-05-13
                • 1970-01-01
                • 1970-01-01
                • 2015-08-02
                • 2023-03-28
                • 2023-04-09
                • 1970-01-01
                相关资源
                最近更新 更多