Добрый день!
У меня есть две таблицы "Улицы" и "Строения". Строения привязаны к "Улицам" Необходимо осуществить поиск нужного строения имея поисковой запрос в виде текста(если поисковой запрос не точен - можно несколько результатов).
У строк есть так же "алиасы", те разные вариации написания(title: Чапаева, sub_titles: Кирова|Пушкина), те улица может иметь синонимы в названии.(формат хранения алиасов может быть любой, как вы скажете так и буду хранить).
Например: "Чапаева 14", "Чапаева", "улица Чапаева 14", "14 Чапаева" итд
`streets` (
`street_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`sub_titles` varchar(255) DEFAULT NULL,
PRIMARY KEY (`street_id`)
);
`locations` (
`location_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`street_id` smallint(5) unsigned DEFAULT NULL,
`title` varchar(100) NOT NULL,
PRIMARY KEY (`location_id`)
);
Нужно получить идентификаторы строений подходящих под поисковой запрос.
Пригодится любая помощь и советы. Даже просто описание запроса на "человеческом" языке, попробую если что сам его составить.
1. Serpanok - 10 Октября, 2017 - 15:13:24 - перейти к сообщению
2. LIME - 10 Октября, 2017 - 15:29:10 - перейти к сообщению
хм интересненько
во первых надо title и sub_titles перенести в отдельную таблицу один к многим street_title(тут рекомендую узнать что есть такое нормализация)
id, street_id, title
тогда сможем джойнить в запросе
по поводу текста
разбиваем текст на слова и ищем каждое слово в street_title
если слов несколько можно заюзать UNION
числа можно сразу отбросить еще в пыхе чтоб зря не нагружать запрос
пример "улица Чапаева 14"
во первых надо title и sub_titles перенести в отдельную таблицу один к многим street_title(тут рекомендую узнать что есть такое нормализация)
id, street_id, title
тогда сможем джойнить в запросе
по поводу текста
разбиваем текст на слова и ищем каждое слово в street_title
если слов несколько можно заюзать UNION
числа можно сразу отбросить еще в пыхе чтоб зря не нагружать запрос
пример "улица Чапаева 14"
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- (SELECT street_id FROM street_title WHERE title = 'улица'
- UNION
- SELECT street_id FROM street_title WHERE title = 'Чапаева')
- -- 14 отбросим еще в пыхе
- LIMIT 1
или
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT * FROM streets
- JOIN street_title USING(street_id)
- WHERE street_title.title IN ('улица', 'Чапаева')
- LIMIT 1
както так примерно
(Добавление)
если в streets нет других данных кроме приведенных можно просто привести ее к виду street_title но тут надо учесть что могут появится другие данные в будущем
например население улицы, пешеходная она или транспортная итд
тогда лучше разделить на 2 как выше предлагал
надеюсь понятно тут много буков написал))