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

时间:2011-04-21 10:59:59

标签: mysql select sql-like

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

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

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

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

有人知道如何管理吗?

感谢。

10 个答案:

答案 0 :(得分:38)

您是否只想搜索字边界?如果是这样,原始版本可能是:

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

或者你可能会有点聪明,并使用以下REGEXP

寻找单词边界
SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";

答案 1 :(得分:7)

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上有索引,则第二个条件可能会提高您的查询效果。

答案 2 :(得分:7)

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

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

不确定效率或是否涵盖所有情况,所以如果效率非常低或太不优雅,请随意投票。

答案 3 :(得分:5)

尝试使用正则表达式:

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

答案 4 :(得分:1)

删除LIKE关键字并使用=进行完全匹配

修改

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

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

答案 5 :(得分:1)

然后不要使用LIKE,而是搜索相等。

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

BTW我希望你在查询中使用它之前清理/转义$ search。

答案 6 :(得分:0)

使用equals(=)?

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

如果您希望匹配精确单词,请不要使用LIKE

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

如果您想使用LIKE从MySql搜索精确的单词匹配,请使用:

SELECT * FROM tableName WHERE columnName LIKE 'your_query' ; 

答案 9 :(得分:-1)

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

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