Помогите составить запрос...

yrtimD

Guest
Помогите составить запрос...

Нужно сравнить между собой две строки:
1 - поле (char) из базы данных
2 - строковая переменная $search из скрипта на php

Чтобы при этом из поля char удалялись некоторые символы.
Например $search = "23 ABC", а поле в таблице mySQL = "23 (a.b.c.)"
В данном примере обе строки должны быть равны.

У меня получилось только вот так:

select ucase(concat(REPLACE(REPLACE( REPLACE('23 (a.b.c.)', '.','') ,')',''), '(', ''))) REGEXP '$search'

Но что делать если потребуется заменить не только круглые скобки и точку, но и ряд других символов?
Маразматически прописывать бесконечную последовательность "REPLACE(REPLACE(REPLACE..."???
 

yrtimD

Guest
23 abc == 23 a.b.c.!

Приблизительно так и сделал =)
Создал вторую таблицу с полями: это ID той таблицы, и текстовое поле с данными, соответствующими тому что пользователь имел ввиду на самом деле. Теперь всё работает. И "23 abc", и "23 a.b.c." и даже "32 abd" будет находить.
Только вот я не понял, как введение дополнительных данных может _благотворно_ сказаться на скорости выполнения запросов... Скорее наоборот...
Тем не менее, это уже благотворно сказалось на результах поиска. Пользователь информацию находит, и это главное.
Но это частное решение. А вообще, по-моему, к mySQL нужно прикручивать какой-нибудь "лингвистический модуль". Стандартные запросы типа like или regexp очень далеки от желаемых результатов при поиске текстовых данных.
 

yrtimD

Guest
Как найти информацию при кривом запросе юзера?

Касательно скорости запросов: быстрее чего? Join'a? Тогда конечно быстрее. Но почему если _дополнительная_ таблица, то _следовательно_ join? Я join'ы вообще не использую :) Ну не то что бы "вообще", но "очень редко". Без них всё работает.

Дополнительная таблица (или "вторая таблица наименований") содержит множество вариантов написания строки "23 a.b.c." (из первой таблицы наименований), а также варианты других строк, с типичными опечатками и т.п.

Результаты поиска вида "not found" тщательно изучаются, и порой бывает, что пользователь просто переврал наименование. В таком случае кривой запрос добавлятеся во вторую таблицу, и следующий невнимательный юзер всё найдет. Удобно юзеру? Не совсем. :) Получается такая штука: первые юзеры со своими кривыми запросами обламываются, а все последующие юзеры (с такими же кривыми запросами) начинают что-то находить. Это не есть хорошо, так как первые юзеры уже ушли!

В целом, у меня проблема "Как mysql может найти информацию при кривом запросе". "Кривой запрос" в данном контексте - это запрос пользователя, в котором есть опечатки. Он не соответствует значению текстового поля базе, но соответствует по смыслу. Like и regexp ничего не находят. :(
 
Сверху