MySQL: Что такое обратная версия LIKE?

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

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

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

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

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

Ответ 1

Здесь вы можете достичь того, что вы описываете:

SELECT name FROM user 
WHERE 'John Smith and Peter Johnson are best friends' LIKE
  CONCAT('%', name, '%')

Ответ 2

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' ,'%');

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

Ответ 3

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

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