Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Запрос по населенным пунктам  [new]
Prizzrak
Member

Откуда: Москва
Сообщений: 1937
Нужны ваши светлые головы и опыт, который не пропьешь.

Есть табличка

CREATE TABLE `kss_settlements` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(256) DEFAULT NULL,
  `full_name` longtext,
  `ter_name` varchar(45) DEFAULT NULL,
  `code` varchar(13) DEFAULT NULL,
  `coordinate_json` json DEFAULT NULL,
  `coordinate` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `I_NAME` (`name`),
  KEY `I_CODE` (`code`),
  KEY `I_COORDINATE` (`coordinate`),
  FULLTEXT KEY `FT_NAME_FNAME` (`name`,`ter_name`,`full_name`)
) ENGINE=InnoDB AUTO_INCREMENT=213933 DEFAULT CHARSET=utf8;


В ней данные

idnamefull_nameter_namecodecoordinate_jsoncoordinate
100802Массив Иваново Иваново-ДМассив Иваново Иваново-Д Садовое неком-е товарищество, Приозерский Район, Ленинградская ОбластьСадовое неком-е товарищество4701500077451NULLNULL
68082ИвановоГород Иваново, Ивановская ОбластьГород3700000100000NULLNULL
105069ИвановоДеревня Иваново, Город Егорьевск, Московская ОбластьДеревня5000003906100NULLNULL
105684ИвановоДеревня Иваново, Город Руза, Московская ОбластьДеревня5000004507900NULLNULL
.....................

Данных много. Мне надо выбирать из этой таблицы данные по 5 штук сортируя так, чтобы на первых местах всегда были строки где поде name совпадает с фильтром или включает его в начале строки, при этом города были на первом месте. При этом чтобы точное совпадение названия с полем name имело высший приоритет над строками где это поле просто входит в строку. Далее надо, чтобы если после названия в строке поиска начали вводить название территориальной единицы или области в которой находится искомое то оно тоже находилось.

В примерах:
Вводят слово "Иваново". Результат в порядке следования ID 68082->105069->105684->100802
Вводят слова "Иваново дер". Результат в порядке следования ID 105069->105684
Вводят слова "Иваново мос". Результат в порядке следования ID 105069->105684
Вводят слова "дер Иваново Егор". Результат 105069

Нужно это на сайте для выпадающей подсказки в поле выбора населенного пункта.

Табличка моя, могу её переделать, если надо. Сайт на php потому могу строку запроса форматировать с помощью php.

Нужны Ваши идеи. Сам в тупике.

Сообщение было отредактировано: 1 ноя 20, 17:34
1 ноя 20, 17:38    [22224424]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
Prizzrak
сортируя так, чтобы на первых местах всегда были строки где поде name совпадает с фильтром или включает его в начале строки

ORDER BY name LIKE CONCAT(criteria, '%') DESC
1 ноя 20, 19:46    [22224476]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Prizzrak
Member

Откуда: Москва
Сообщений: 1937
Akina
Prizzrak
сортируя так, чтобы на первых местах всегда были строки где поде name совпадает с фильтром или включает его в начале строки

ORDER BY name LIKE CONCAT(criteria, '%') DESC


Ну зачем же было себя так утруждать и дочитывать до этой строки, особенно учитывая, что дочитывать Вы не собирались?
2 ноя 20, 14:55    [22224947]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
Если Вам этого недостаточно, то, боюсь, что и полный ответ не поможет... Вы в курсе, что выражение в ORDER BY может состоять из нескольких последовательных выражений?
2 ноя 20, 15:38    [22225002]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Prizzrak
Member

Откуда: Москва
Сообщений: 1937
Akina
Если Вам этого недостаточно, то, боюсь, что и полный ответ не поможет... Вы в курсе, что выражение в ORDER BY может состоять из нескольких последовательных выражений?

А вы попробуйте сделать полный ответ. В примере всего 4 случая. Будьте так любезны, покажите полный ответ хотя бы для этих 4-х случаев. В реальности их конечно больше, но на этих четырёх станет понятно основная идея Вашей рекомендации.
2 ноя 20, 16:33    [22225068]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Prizzrak
Member

Откуда: Москва
Сообщений: 1937
Akina
Prizzrak
сортируя так, чтобы на первых местах всегда были строки где поде name совпадает с фильтром или включает его в начале строки

ORDER BY name LIKE CONCAT(criteria, '%') DESC


Вообще идея интересная. У меня правда пока не получается все 4 примера получить, но часть получилось.
2 ноя 20, 16:43    [22225079]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
Prizzrak
А вы попробуйте сделать полный ответ. В примере всего 4 случая

Ну так распишите алгоритм чётко. Типа "1) сначала записи, которые ..., 2) затем записи, которые ..."
2 ноя 20, 16:52    [22225089]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Prizzrak
Member

Откуда: Москва
Сообщений: 1937
Akina
Prizzrak
А вы попробуйте сделать полный ответ. В примере всего 4 случая

Ну так распишите алгоритм чётко. Типа "1) сначала записи, которые ..., 2) затем записи, которые ..."


А всё! Уже не надо! Вы мне уже помогли!

У меня вот что получилось:
SELECT *
FROM kss_settlements 
WHERE MATCH (name,ter_name,full_name) AGAINST('>"Иваново" <(+Иваново*)' IN BOOLEAN MODE) 
ORDER BY name LIKE "Иваново%" DESC, 
    ter_name="Город" DESC, 
    MATCH (name,ter_name,full_name) AGAINST('>"Иваново" <(+Иваново*)' IN BOOLEAN MODE) DESC 
LIMIT 0, 5;


И этого вполне достаточно!

Спасибо!
2 ноя 20, 16:54    [22225092]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20785
Ещё в начало бы добавить

ORDER BY name = "Иваново", name LIKE "Иваново%" DESC, ...

А то попадётся какое-нить Иваново-Марьинское, которое сейчас может запросто вылезти на самый верх.
2 ноя 20, 16:57    [22225097]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по населенным пунктам  [new]
Prizzrak
Member

Откуда: Москва
Сообщений: 1937
Akina
Ещё в начало бы добавить

ORDER BY name = "Иваново", name LIKE "Иваново%" DESC, ...

А то попадётся какое-нить Иваново-Марьинское, которое сейчас может запросто вылезти на самый верх.

Добавил. Ещё раз спасибо!
2 ноя 20, 17:03    [22225108]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить