Сложный поиск в бд

Ответить
Аватара пользователя
Abell2000

Сложный поиск в бд

Сообщение Abell2000 »

Народ, появилась проблема,

есть две таблицы и нужно сравнить несколько полей на предмет совпадений, задача нетривиальная, но вот в чем проблема:

скажем есть поле model и в нем данные : 280XL, 280 XL, 280-XL, XL 280,

а в другой таблице для model: 280xL, так вот, если посмотреть, то в первой таблице записаны одни и теже данные только по разному, с пробелом, без, с тире, задом наперед, возможно ли произвести поиск, чтоб вернуть все результаты?



P.S. используется MySQL и PHP
Аватара пользователя
Prisoner

Re: Сложный поиск в бд

Сообщение Prisoner »

В PHP есть множество строковых функций которые возвращают схожесть по таким признакам как звучание. Аналог такой функции в MySql - SOUNDEX(str)


Цитата:



SOUNDEX(str)

Возвращает саундекс от str. Soundex - ``идентификатор звучания строки''. Словосочетания ``К скалам бурым'' и ``С каламбуроми'' должны давать одинаковый саундекс, т.к. на слух они звучат одинаково. Заметим, однако, что этой функции для русского языка не существует. MySQL нуждается в ней, и если кто-то может предоставить алгоритм саундекса на русском языке - свяжитесь с нами. - Прим. переводчика. Две созвучные строки, создающие впечатление почти одинаковых, могут иметь идентичные саундексы. Обычно стандартная саундекс-строка имеет длину 4 символа, но функция SOUNDEX() возвращает строку произвольной длины. Можно использовать функцию SUBSTRING() для извлечения стандартного саундекса строки из результата функции SOUNDEX(). В строке str игнорируются все символы, не являющиеся буквами или цифрами. Все международные буквенные символы, не входящие в диапазон A-Z, трактуются как гласные:



Код:

Код: Выделить всё

mysql> SELECT SOUNDEX('Hello');
        -> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
        -> 'Q36324'





Кстати, если Вам необходима функция и для русских слов, то не стоит сразу отметать это способ, справьтесь, возможно, что поддержку русского языка уже добавили.
Аватара пользователя
ivank

Re: Сложный поиск в бд

Сообщение ivank »

Логичней пройтись по всем записям в базе и нормализовать (привести к общему виду) их, используя некую эвристику. Саундэкс xl-280 и 280-xl _всегда_ буде разным. То бишь перестановки влияют на саундэкс очень сильно, поэтому это не очень хороший метод, как мне кажется.
Аватара пользователя
mar

Re: Сложный поиск в бд

Сообщение mar »

мне как-то (на postgresql) приходилось делать нечто подобное. Но там большой выбор строковых функций и регекспов. На мой вкус ivank совершенно прав - проще все привести в порядок один раз + сделать программный фильтр-поправлялку на ввод данных на будущее.
Аватара пользователя
hasherfrog

Re: Сложный поиск в бд

Сообщение hasherfrog »

Я всё же перенесу тему, хоть и не совсем это "вебмастеру" а, скорее, "web-программирование".
Аватара пользователя
Prisoner

Re: Сложный поиск в бд

Сообщение Prisoner »

На правах оправдания Изображение. Конечно, порядок - хорошо вельми. Я ориентировался на "сравнить". Это понятие, имхо, не включает наведение порядка, относящееся скорее к организации процесса сравнения.
Аватара пользователя
mar

Re: Сложный поиск в бд

Сообщение mar »

Prisoner

так порядок наводить-то как? как раз предложенным тобой способом Изображение
Ответить

Вернуться в «Вебмастеру»