2010-01-23 3 views
0

есть способ написать sql-запрос, который находит все строки, где значение поля является подстрокой заданной строки.mysql: найдите строки, у которых есть поле, которое является подстрокой «string»

Пример:

table names 

Name  |  Nickname 
rohit   iamrohitbanga 
banga   rohitnick 
sinan   unur 

запрос должен быть чем-то вроде

select * from names where Name is a substring of "who is rohit"; // to get first row 
select * from names where Nickname is a substring of "who is rohitnick"; // to get second row 
select * from names where Name is a substring of "who is unur and banga" 
or Nickname is substring of "who is unur and banga"; // to get second and third row 

Как это возможно?

Если это невозможно, мне нужно будет выполнить это поведение в java. Я использую драйвер jdbc: mysql для подключения к базе данных.

Update ваши решения работают

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

select * from names where Name is a substring of "who is sina"; // to get third row 
+1

Это неуважение к тем, кто предоставил ответы, чтобы потом изменить критерии. –

+1

@iamrohitbanga: Я согласен с «OMG Ponies». Плакаты не получают уведомление о том, что вы изменили свой вопрос, поэтому большинство из них не будут обновлять свои ответы. Если ваша первоначальная проблема решена, примите ответ и не стесняйтесь добавить еще один вопрос. Кроме того, я не вижу разницы между вашим новым запросом («Имя - подстрока чего-то») и исходными запросами («Имя - подстрока чего-то») –

+0

согласен! вы правы –

ответ

3

Если один из Name или Nickname должен быть найден в тексте используйте

SELECT * 
FROM names 
WHERE instr("who is Rohit", Name) > 0 
    OR instr("who is Rohit", Nickname) > 0 

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

1
SELECT * FROM names WHERE INSTR(Nickname,Name) > 0; 

или, что то же самое:

SELECT * FROM names WHERE LOCATE(Name,Nickname) > 0; 
+0

no. Кажется, что fireeyedboy сделал это правильно. я проверю это. так или иначе вы указали ту же функцию. –

+0

Извините, я тогда не понимаю вопроса. :) Но ладно. –

2

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

Я бы пересмотрел этот подход, если ваш стол будет большим. Возможно, вам нужен индексированный искатель, такой как Lucene.

+0

У меня есть люцен в виду. но прямо сейчас для прототипа я хочу что-то простое. –

+0

Уверенность в том, что у меня есть, что мои поля обычно маленькие. поэтому стоит создать «Документ Люцен» для каждой строки. Lucene будет соответствовать документам, основанным на tf/idf, который измеряет частоту. поэтому оба моих документа были бы небольшими. это люцен - хороший вариант. –

1

Вы также можете изменить условие LIKE.

select * from names where "who is rohit" LIKE CONCAT('%', Name, '%'); 

Заметим, что это, вероятно, не быстрее, чем инстр («кто Рохит», название), но это может быть.

Смежные вопросы