+ Ответить в теме
Показано с 1 по 6 из 6

Тема: Поиск по двум связанным таблицам

  1. #1
    dummy serpanok is on a distinguished road
    Регистрация
    10.10.2017
    Возраст
    22
    Сообщений
    3
    Вес репутации
    0

    Exclamation Поиск по двум связанным таблицам

    Добрый день!

    У меня есть две таблицы "Улицы" и "Строения". Строения привязаны к "Улицам" Необходимо осуществить поиск нужного строения имея поисковой запрос в виде текста(если поисковой запрос не точен - можно несколько результатов).
    У строк есть так же "алиасы", те разные вариации написания(title: Чапаева, sub_titles: Кирова|Пушкина), те улица может иметь синонимы в названии.(формат хранения алиасов может быть любой, как вы скажете так и буду хранить).

    Например: "Чапаева 14", "Чапаева", "улица Чапаева 14", "14 Чапаева" итд

    Код :
    1. `streets` (
    2.   `street_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
    3.   `title` varchar(100) NOT NULL,
    4.   `sub_titles` varchar(255) DEFAULT NULL,
    5.   PRIMARY KEY (`street_id`)
    6. );
    7. `locations` (
    8.   `location_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
    9.   `street_id` smallint(5) unsigned DEFAULT NULL,
    10.   `title` varchar(100) NOT NULL,
    11.   PRIMARY KEY (`location_id`)
    12. );


    Нужно получить идентификаторы строений подходящих под поисковой запрос.

    Пригодится любая помощь и советы. Даже просто описание запроса на "человеческом" языке, попробую если что сам его составить.

    p.s. Я понимаю что это MySQL, но суть таблицы думаю понятна. Если что я разберусь как адаптировать запрос под MySQL. Советы подойдёт на любом языке

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Administrator Админ
    system architect
    AiK is on a distinguished road Аватар для AiK
    Регистрация
    13.02.2004
    Адрес
    СПб
    Сообщений
    2,298
    Вес репутации
    80

    По умолчанию Re: Поиск по двум связанным таблицам

    Исходную поисковую строку надо разбить на "слова" по пробелам и обработать каждое слово. Лучше делать это не средствами MySQL, а средствами того языка из которого идёт обращение к БД.

    Что делать со словами
    1. Попробовать преобразовать в числовое значение. Если получилось - это строение. то надо запомнить в переменную.
    2. Если не получилось, то надо проверить не является ли слово сокращением от улицы, проспекта, переулка и т.д.
    Вначале надо просто составить список этих сокращений самостоятельно, а потом анализировать все запросы, которые не дали результатов и обновлять список сокращений. Повылезают интересности типа "улю" вместо "ул." и т.д., ну и проспект можно кучей вариаций сократить.
    3. Дальше я бы рекомендовал хранить в таблице улиц тип улицы - улица, проспект, проезд, бульвар и т.п. , потому что в городе легко могут быть улица и проспект с одинаковым именем
    4. тип улицы и строение из запроса надо удалять и искать только по очищенному наименованию.
    5. алиасы названий (типа старые наименования) надо сливать в одну строку
    6. делать поиск банальным like с добавлением знака '%' в начало и конец очищенного наименования

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

    Не описал обработку в исходной поисковой строке букв в строении, типа 13а.

    Итого
    Код sql:
    1. SELECT
    2. *
    3. FROM
    4. streets s,
    5. locations l
    6. WHERE
    7. s.street_id = l.streed_id
    8. AND l.title = @building
    9. AND s.full_title LIKE CONCAT('%', @street_name, '%');
    Даже самый дурацкий замысел можно воплотить мастерски

  4. #3
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Поиск по двум связанным таблицам

    Цитата Сообщение от serpanok Посмотреть сообщение
    Например: "Чапаева 14", "Чапаева", "улица Чапаева 14", "14 Чапаева" итд
    p.s. Я понимаю что это MySQL, но суть таблицы думаю понятна. Если что я разберусь как адаптировать запрос под MySQL. Советы подойдёт на любом языке
    Не важно насколько сложным будет запрос, работать он будет плохо. Для такиих вещей есть другие инструменты типа elasticsearch.
    2B OR NOT(2B) = FF

  5. #4
    dummy serpanok is on a distinguished road
    Регистрация
    10.10.2017
    Возраст
    22
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Re: Поиск по двум связанным таблицам

    Цитата Сообщение от Absurd Посмотреть сообщение
    Не важно насколько сложным будет запрос, работать он будет плохо. Для такиих вещей есть другие инструменты типа elasticsearch.
    На сколько я понял он ставится только вручную на сервер, а у меня простой хостинг

  6. #5
    dummy serpanok is on a distinguished road
    Регистрация
    10.10.2017
    Возраст
    22
    Сообщений
    3
    Вес репутации
    0

    Thumbs up Re: Поиск по двум связанным таблицам

    AiK,спасибо большое!

  7. #6
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    38
    Сообщений
    1,213
    Вес репутации
    17

    По умолчанию Re: Поиск по двум связанным таблицам

    Цитата Сообщение от serpanok Посмотреть сообщение
    На сколько я понял он ставится только вручную на сервер, а у меня простой хостинг
    Ну тогда нужно искать легковесную альтернативу на php, типа такого

    http://www.sphider.eu/download.php

    Еще можно попробовать сделать полнотекстовый индекс по всем возможным комбинациям написания каждого адреса.
    2B OR NOT(2B) = FF

+ Ответить в теме

Похожие темы

  1. Left Join по двум полям
    Добрый день! Помогите разобраться в чем косяк.... Есть две таблицы, я создаю две виртуальные таблицы по каждой физической в которых есть 2 ключевых...
    от Dr_Grizzly в разделе SQL
  2. Вроде простой запрос по 3 таблицам
    В SQL пока новичок, поэтому не получается вроде бы простой запрос: Есть 3 таблицы: 1. Сальдо Date In Out 200904 0 100 200905 100 ...
    от PAleN в разделе SQL
  3. ВПР по двум значениям
    Добрый день, очень нужна функция подобная ВПР, но по двум значениям. Пример, Таблица1 Область Город Значение...
    от linka0811 в разделе MS Office и VB(A).
  4. Помогите, пожалуйста, создать запрос в режиме конструктора к таблицам в Accesse
    ОЧЕНЬ СРОЧНО!!! Добрый день, умные головы : ) Помогите пожалуйста. Я создала обычную таблицу и теперь мне у ней надо сделать запросы: (...
    от Лилечка в разделе MS Office и VB(A).
  5. Доступ к системным таблицам ACCESS
    При подключении через Jet4 можно получить имена системных таблиц, но как получить к ним доступ? :evil:
    от GOS в разделе MS Office и VB(A).

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения