MySQL - Как найти точное совпадение слов с помощью LIKE? - PullRequest
27 голосов
/ 21 апреля 2011

Я использую этот запрос для выбора данных:

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

Единственная проблема в том, что он иногда выбирает больше, чем мне хотелось бы.

Например, я хотел бычтобы выбрать продукт "BLA", но в моем запросе также выберите продукт "BLABLA".Чтобы было ясно, если я хотел выбрать «Продукт 1», я не хочу, чтобы запрос выбирал «Продукт 11».

Кто-нибудь знает, как с этим справиться?

Спасибо.

Ответы [ 9 ]

38 голосов
/ 21 апреля 2011

Вы просто хотите найти границы слов?Если это так, грубая версия может быть:

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

Или вы можете быть немного умнее и искать границы слов со следующими REGEXP

SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";
7 голосов
/ 01 июня 2016

Нашел этот вопрос в 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

Не уверен насчет эффективности или того, распространяется ли это на все случаи, поэтому не стесняйтесь понижать голос, если это действительно неэффективно или слишком не элегантно.

7 голосов
/ 21 апреля 2011
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.

5 голосов
/ 04 февраля 2017

Попробуйте использовать регулярные выражения:

SELECT 
    *
FROM
    `products`
WHERE
    product_name regexp '(^|[[:space:]])BLA([[:space:]]|$)';
1 голос
/ 21 апреля 2011

Тогда не используйте LIKE, но ищите равенство.

т.е.*

1 голос
/ 21 апреля 2011

Удалите LIKE ключевое слово и используйте = для точного соответствия

РЕДАКТИРОВАТЬ

не забудьте выйти из пользовательского ввода, используя mysql_real_escape_string в противном случае ваш запрос не будет выполнен, если кто-нибудь введет кавычки в поле ввода.

$search=mysql_real_escape_string($search);
mysql_query("SELECT * FROM products WHERE product_name='".$search."'");
0 голосов
/ 26 декабря 2016

вы можете использовать подобный запрос, например, я также использую в cakePHP , и это полезно.

Select * from `users` where username COLLATE latin1_general_cs LIKE '%$email%'
0 голосов
/ 30 марта 2016

попробуйте использовать регулярное выражение в запросе

mysql_query("SELECT * FROM products WHERE product_name regexp '".$search."'");
0 голосов
/ 21 апреля 2011

Использовать равно (=)?

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

Если вы ищете подходящие слова, не используйте LIKE.

РЕДАКТИРОВАТЬ: Это немного проясняет тогда. Просто добавьте пробел после поискового запроса. Или даже добавьте дефис (-), если это всегда в поисковом запросе.

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