MySQL - 如何使用 LIKE 搜索精确的单词匹配?

Posted

技术标签:

【中文标题】MySQL - 如何使用 LIKE 搜索精确的单词匹配?【英文标题】:MySQL - How to search for exact word match using 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”。 【参考方案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%'

【讨论】:

以上是关于MySQL - 如何使用 LIKE 搜索精确的单词匹配?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的Like和正则表达

如何仅在 LIKE 查询 Laravel 中找到整个单词?

mysql怎么用like检索字段中带有数字的语句?

在 T-SQl 中使用 like 搜索由未知数量的空格分隔的单词

MySQL 部分单词匹配结合 MATCH...AGAINST 和 LIKE 作为备份

搜索一个单词,就像我在codeigniter中的文本框中给出的不完全一样