Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Искать данные с начала слов


Автор: DissDoc 22.10.2010, 07:35
Всем привет. Итак проблема, есть набор слов в БД (один столбец)
Код

Петров Петр
Иванов Иван
Сидоров Сидр
Сергеев Сергей
Васильев Василий
Васильев Иван

Нужно сравнивать запрос только с начала слов
Если делаю так
Код

like '%в%'

То мне выдастся все!
А нужно сравнивать от начала слов. Тогда мне по запросу like '%Ив%' получу список
Иванов Иван
Васильев Иван

Как такое реализовать?

Автор: Akina 22.10.2010, 07:56
Это - диалектозависимо. Указывайте СУБД и просите перенести тему в соотв. раздел.

Автор: A5uKa 22.10.2010, 07:57
Код

like 'в%'

?

Автор: Akina 22.10.2010, 07:58
Возможный более-менее независимый вариант:
Код

Where (' ') + fld Like '% Ив%'

Да и тот - зависит от маско-символов диалекта.

Автор: Frees 22.10.2010, 08:08
Цитата(DissDoc @  22.10.2010,  10:35 Найти цитируемый пост)
А нужно сравнивать от начала слов. Тогда мне по запросу like '%Ив%' получу списокИванов ИванВасильев Иван


Код

field1 like 'Ив%' or field1 like ' Ив%'

Автор: Zloxa 22.10.2010, 08:46
Цитата(Frees @  22.10.2010,  08:08 Найти цитируемый пост)
field1 like 'Ив%' or field1 like ' Ив%'

"Васильев Иван" не отберется.

Автор: Akina 22.10.2010, 09:03
Цитата(Frees @  22.10.2010,  09:08 Найти цитируемый пост)
field1 like 'Ив%' or field1 like ' Ив%'

Тогда уж
Код

field1 like 'Ив%' or field1 like '% Ив%'


Автор: Frees 22.10.2010, 09:24
Цитата(Akina @  22.10.2010,  12:03 Найти цитируемый пост)
Тогда уж

Это я и имел ввиду... 

вариант
Код

Where (' ') + fld Like '% Ив%'

мне больше понравился (я не видел этот пост когда писал свой)

Автор: Zloxa 22.10.2010, 09:29
Цитата(Akina @  22.10.2010,  09:03 Найти цитируемый пост)
Тогда уж

все равно full scan

Автор: DissDoc 22.10.2010, 10:10
У меня MySQL. Это может сильно влиять?

Автор: Frees 22.10.2010, 10:17
Цитата(DissDoc @  22.10.2010,  13:10 Найти цитируемый пост)
У меня MySQL. Это может сильно влиять?

может в сторону полнотекстового поиска посмотреть...

Автор: skyboy 22.10.2010, 10:23
конечно, может.
потому что в mysql есть встроенные http://habrahabr.ru/blogs/webdev/40218/. но там есть конструктивное ограничение - работает только для myisam таблиц. а у них уже не работают транзакции. т.е. если «хочется» и транзакции иметь, и шустрый полнотекстовый поиск, то fulltext index уже «не то».
в таком случае будет лучше использовать http://sphinxsearch.com. правда, это потребует запуска отдельной программы, что не на каждом хостинге будет возможно.

Автор: skyboy 22.10.2010, 10:23

M
skyboy
Перенесено из баз данных

Автор: Zloxa 22.10.2010, 10:31
быть может ему не надо индексирования, а достаточно rlike '[^|/W]Ив'

Автор: DissDoc 22.10.2010, 12:56
А rlike выполняется в запросе в MySQL?

Автор: Zloxa 22.10.2010, 13:06
Цитата(DissDoc @  22.10.2010,  12:56 Найти цитируемый пост)
А rlike выполняется в запросе в MySQL? 

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

Автор: DissDoc 23.10.2010, 10:05
Zloxa, ваш запрос не совсем верно работает. Я вот все никак не мог успокоиться и в результате нашел правильное решение для себя. Мне кажется оно более простое
Код

like '% Ив%' or like 'Ив%'

можно даже чуть ограничить в моем контекста и сравнивать по регистру через BINARY smile

Автор: tishaishii 23.10.2010, 21:40
regexp там точно есть, только зачем? Для задачи достаточно match..against in boolean mode, а regexp индексы не пользует (если и можно, то с пробелмами), like пользует только если поиск с начала строки. Можно поставить триггер к таблице, который бы вёл другую таблицу со списками слов по нужным полям. Тогда, при поиске, можно использовать простые индексы и свои навороты.

Автор: Zloxa 24.10.2010, 09:46
Цитата(tishaishii @  23.10.2010,  21:40 Найти цитируемый пост)
regexp индексы не пользует

приведенные лайки тоже не используют, но регексп предпочтительнее, если у нас разделителем может являться не только пробел: "Абу-т-Тайиб Абу-Салим аль-Мутанабби",'Мамин-Сибиряк'.

А возможность использования fulltext я не оспариваю. Однако, как уже было замечено, fultext нельзя исползьзовать на InnoDb, да и на мылых объемах  обоснованость его применения - условна. ТС не спрашивает как ускорить like, он спрашивает как его реализовать. Значит, полагаю, производительность like его устраивает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)