Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Сложный поиск в бд (http://forum.oszone.net/showthread.php?t=71934)

Abell2000 26-09-2006 10:48 489658

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

P.S. используется MySQL и PHP

Prisoner 26-09-2006 11:58 489694

В 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 26-09-2006 16:45 489853

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

mar 26-09-2006 18:47 489927

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

hasherfrog 26-09-2006 19:08 489941

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

Prisoner 27-09-2006 11:03 490183

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

mar 27-09-2006 12:39 490241

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


Время: 22:42.

Время: 22:42.
© OSzone.net 2001-