Запрос MySQL для поиска всех URL-адресов, которые являются подстрокой других URL-адресов

#mysql

#mysql

Вопрос:

У меня есть поле MySQL URL типа Varchar.

Возможно ли с помощью одного запроса MySQL вернуть все записи, где строковое значение URL является подстрокой другого URL значения записи, и отобразить как подстроки, так и полные записи строк?

Ответ №1:

Вы объединяете таблицу с самой собой. Что-то вроде:

ВЫБЕРИТЕ t1.URL, t2.URL В КАЧЕСТВЕ SUBURL
ИЗ mytable t1, mytable t2
ГДЕ INSTR(t1.URL, t2.URL) > 0
И t1.ID < t2.ID

Обратите внимание, что запрос имеет сложность N ^ 2, а сопоставление строк происходит медленно. Ожидайте ужасную производительность на больших таблицах.

Ответ №2:

В общем, ответ «Да» с использованием функций INSTR() или LOCATE(). Но это зависит от того, как хранятся ваши URL-адреса. Такие вещи, как «http: //», поддомены и тому подобное, могут дать вам много ложных срабатываний или ложноотрицательных результатов. Не false в том смысле, что INSTR () сломан, но false в том смысле, что он не будет делать то, что вы могли бы от него захотеть.

Комментарии:

1. Я не возражаю против ложных срабатываний, пока я получаю истинные положительные результаты. Мне было бы интересно посмотреть, как вы напишете запрос, используя LOCATE().

2. LOCATE() и INSTR() работают практически одинаково. Порядок аргументов отличается, и LOCATE() позволяет вам указать начальную позицию, которая, вероятно, не имеет значения в вашем случае. (Но мы не видели никаких ваших данных.) Смотрите, как Elad использует INSTR() .