Не выбираются уникальные записи

95
23 апреля 2022, 11:10

Имеется следующая таблица:

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 'мос%'

Но блин выгляди как костыль.

Как можно отсечь повторяющиеся записи в этом примере?

Answer 1
SELECT * 
FROM station_references
WHERE LOCATE(@pattern, NameRu)
ORDER BY LOCATE(@pattern, NameRu);

fiddle

READ ALSO
Проблема с подключением БД

Проблема с подключением БД

Ненавижу БД и всё, что с ними связано, но работать как то надоПытаюсь подключить БД, выдаёт ошибку

149
выбрать строку по значению столбца mysql

выбрать строку по значению столбца mysql

Имеется простейшей структуры БД:

233
MySQL запрос как оптимизировать?

MySQL запрос как оптимизировать?

Хотелось бы узнать, возможно ли оптимизировать данный запрос ?

232