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

Mik*_*ike 27 mysql select sql-like

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

mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'");
Run Code Online (Sandbox Code Playgroud)

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

例如,我想选择产品"BLA",但我的查询也选择产品"BLABLA".要清楚,如果我想选择"产品1",我不希望查询选择"产品11".

有人知道如何管理吗?

谢谢.

Jam*_*s C 39

你只想搜索单词边界吗?如果是这样,原始版本可能是:

SELECT * FROM products WHERE product_name LIKE "% foo %";
Run Code Online (Sandbox Code Playgroud)

或者你可能会更聪明一点,并通过以下方式寻找单词边界 REGEXP

SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";
Run Code Online (Sandbox Code Playgroud)

  • 我不认为头号效果很好,想想'foo'的价值! (6认同)

小智 10

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

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
Run Code Online (Sandbox Code Playgroud)

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


Qua*_*noi 7

SELECT  *
FROM    products
WHERE   product_name = 'BLA'
Run Code Online (Sandbox Code Playgroud)

会精确选择 BLA

SELECT  *
FROM    products
WHERE   product_name LIKE 'BLA%'
Run Code Online (Sandbox Code Playgroud)

将选择BLADDERBLACKBERRY,但不REBLAND

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

SELECT  *
FROM    products
WHERE   product_name RLIKE '^Bla[[:>::]]'
        AND product_name LIKE 'Bla%'
Run Code Online (Sandbox Code Playgroud)

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


Fai*_*sal 5

尝试使用正则表达式:

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


Sha*_*ngh 2

删除LIKE关键字并用于=精确匹配

编辑

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

$search=mysql_real_escape_string($search);
mysql_query("SELECT * FROM products WHERE product_name='".$search."'");
Run Code Online (Sandbox Code Playgroud)