Подтвердить что ты не робот

MySQL - Как найти точное совпадение слов, используя LIKE?

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

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

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

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

Кто-нибудь знает, как это сделать?

Спасибо.

4b9b3361

Ответ 1

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

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

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

SELECT * FROM products WHERE product_name RLIKE "[[:<:]]foo[[:>:]]";

Ответ 2

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.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

ИЗМЕНИТЬ

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

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

Ответ 6

Затем не используйте LIKE, а найдите равенство.

т.

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

Кстати. Я надеюсь, что вы дезинфицируете/избегаете $search, прежде чем использовать его в запросе.

Ответ 7

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

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

Если вы хотите совместить ТОЧНЫЕ слова, не используйте LIKE.

EDIT: Это немного облегчает ситуацию. Просто добавьте пробел после поискового запроса. Или даже добавьте дефис (-), если он всегда находится в поисковом выражении.

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

Ответ 8

Для точного соответствия вы должны использовать:

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

Ответ 9

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

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

Ответ 10

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

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