У меня есть дамп базы данных с веб-сайта geonames для Великобритании .Он состоит из около 60000 записей.Пример данных выглядит следующим образом:
id | name | admin1 | admin2 | admin3 | feature_class | feature_code
-------------------------------------------------------------------------------------------
2652355 | Cornwall | ENG | C6 | | A | ADM2
11609029 | Cornwall | ENG | | | L | RGN
6269131 | England | ENG | | | A | ADM1
Первая запись с кодом объекта ADM2 означает, что это административный уровень 2. Запись с кодом функции RGN означает, что это регион.
Я хочупоиск записей по географическим названиям для создания функции автозаполнения.Если записи имеют одно и то же имя и если одна из этих записей является регионом, т.е. имеет RGN feature_code, то я хочу вернуть только эту запись, в противном случае я хочу вернуть запись, которая соответствует этому имени с самым низким идентификатором.
Я пробовал следующее, но это не работает:
SELECT IF(t0.feature_code = 'RGN', MAX(t0.id), MIN(t0.id)) as id
, CONCAT_WS(', ', t0.name,
IF(t3.name != t0.name, t3.name, NULL),
IF(t2.name != t0.name, t2.name, NULL),
IF(t1.name != t0.name, t1.name, NULL)) AS name
FROM locations t0
LEFT JOIN locations t1 ON t1.admin1 = t0.admin1 AND t1.feature_code = 'ADM1'
LEFT JOIN locations t2 ON t2.admin2 = t0.admin2 AND t2.feature_code = 'ADM2'
LEFT JOIN locations t3 ON t3.admin3 = t0.admin3 AND t3.feature_code = 'ADM3'
WHERE
(t0.feature_class IN ('P', 'A') OR (t0.feature_class = 'L' AND t0.feature_code = 'RGN' ) )
AND t0.name like 'Cornwall%'
GROUP BY CONCAT_WS(', ', t0.name,
IF(t3.name != t0.name, t3.name, NULL),
IF(t2.name != t0.name, t2.name, NULL),
IF(t1.name != t0.name, t1.name, NULL))
ORDER BY t0.name
Возвращает неверную запись:
id | name
---------------------------
2652355 | Cornwall, England