MySQL - Как найти точное совпадение слов, используя LIKE?
Я использую этот запрос для выбора данных:
mysql_query("SELECT * FROM products WHERE product_name LIKE '%".$search."%'");
Единственная проблема заключается в том, что она иногда выбирает больше, чем хотелось бы.
Например, я хотел бы выбрать продукт "BLA", но мой запрос также выбирает продукт "BLABLA". Чтобы быть ясным, если бы я хотел выбрать "Продукт 1", я не хочу, чтобы запрос выбирал "Продукт 11".
Кто-нибудь знает, как это сделать?
Спасибо.
Ответы
Ответ 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%'