Имеется следующая таблица:
CREATE TABLE station_references (
ID MEDIUMINT UNSIGNED PRIMARY KEY AUTO_INCREMENT UNIQUE,
Code CHAR(7) UNIQUE NOT NULL,
NameRu VARCHAR(128) NOT NULL,
PopularityIndex SMALLINT UNSIGNED NOT NULL DEFAULT 0,
Description VARCHAR(128) DEFAULT NULL,
IsActive BIT(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;
Пример заполнения таблицы:
INSERT INTO station_references
(Code, NameRu, PopularityIndex, Description, IsActive)
('2000000', 'Москва', 257, '', true),
('2004484', 'Москаленки', 54, '', true),
('2004468', 'Мостовая', 80, '', true);
Нужно показать список городов, которые начинаются с подстроки, либо содержат подстроку. Те города, которые начинаются с подстроки, должны показаться выше чем те что содержат.
Написал такой запрос такой запрос:
SELECT DISTINCT ID, Code, NameRu, PopularityIndex FROM (
SELECT ID, Code, NameRu, 200 + PopularityIndex as PopularityIndex, IsActive
FROM station_references
WHERE NameRu LIKE 'мос%'
UNION -- // или даже UNION DISTINCT
SELECT ID, Code, NameRu, PopularityIndex, IsActive
FROM station_references
WHERE NameRu LIKE '%мос%'
) A
WHERE IsActive = true
ORDER BY PopularityIndex DESC
limit 8;
В выборке 2 раза встречается запись с одним и тем же айдишником не смотря на все DISTINCT.
Ожидаемый результат:
Москва 457
Мостовая 280
Москаленки 254
Полученный результат:
Москва 457
Мостовая 280
Москва 257
Москаленки 254
Пока что решаю проблему, записав условие во втором SELECT следующим образом
WHERE NameRu LIKE '%мос%' AND NameRu NOT LIKE 'мос%'
Но блин выгляди как костыль.
Как можно отсечь повторяющиеся записи в этом примере?
SELECT *
FROM station_references
WHERE LOCATE(@pattern, NameRu)
ORDER BY LOCATE(@pattern, NameRu);
fiddle
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Ненавижу БД и всё, что с ними связано, но работать как то надоПытаюсь подключить БД, выдаёт ошибку