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%'
将选择BLADDER
和BLACKBERRY
,但不选择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 搜索精确的单词匹配?的主要内容,如果未能解决你的问题,请参考以下文章
在 T-SQl 中使用 like 搜索由未知数量的空格分隔的单词