MySQL: Что такое обратная версия LIKE? - PullRequest
34 голосов
/ 23 января 2009
Оператор

LIKE в MySql используется для поиска строк, содержащих текст нашего запроса, например:

select name from user where name like "%john%"

, который вернет John Smith, Peter Johnson и т. Д.

Что если мне понадобится обратное - найти строки, которые СОДЕРЖАТСЯ в нашем тексте запроса? Например, я даю ему John Smith and Peter Johnson are best friends и хочу, чтобы он нашел мне все имена из таблицы, которые можно найти в этой строке.

Как это сделать?

Ответы [ 3 ]

52 голосов
/ 23 января 2009

Вот способ, которым вы можете достичь того, что вы описываете:

SELECT name FROM user 
WHERE 'John Smith and Peter Johnson are best friends' LIKE
  CONCAT('%', name, '%')
1 голос
/ 24 марта 2016
select name
from users
where instr('John Smith and Peter Johnson', name) > 0

Я бы предпочел использовать этот метод вместо:

select *
from users
WHERE  'John Smith and Peter Johnson' LIKE CONCAT('%', name ,'%')

, потому что если есть вероятность, что name может содержать символ % или _ (например, name = 'v% alue'), тогда вышеупомянутый запрос все равно вернет эту запись неправильно. Также обратите внимание, что если ваш столбец может содержать обратную косую черту и / или " C escape-символы ", то они также должны быть экранированы. Это все объясняется в Функции сравнения строк MySQL . Например, приведенный ниже SQL вернет 1:

SELECT 'val\%ue' LIKE CONCAT('%', 'al\\\\\%u' ,'%');

Единственная обратная косая черта должна быть экранирована с помощью \\\\, а символ % экранирован: \%.

0 голосов
/ 23 января 2009

Это проблема индексации текста. Если я правильно понял, ваша задача - найти все ссылки на людей в произвольной форме и не иметь ничего общего с LIKE или NOT LIKE.

В общем виде таблица базы данных, на которую вы ищете ссылки, действует как словарь для некоторого алгоритма индексирования текста. Постройте индекс по входной строке, используя этот словарь, и, надеюсь, вы получите несколько совпадений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...