У меня есть следующий запрос на объединение, в котором я устанавливаю фиктивный номер строки:
SELECT @row_num:=2 as row_num, id, name, admin1, admin3, admin4
FROM locations
WHERE feature_class IN ('P', 'A')
AND name LIKE 'cornwall%'
UNION ALL
SELECT @row_num:=1 as row_num, id, name, admin1, admin3, admin4
FROM locations
WHERE feature_class = 'L' AND feature_code = 'RGN'
AND name LIKE 'cornwall%'
Это возвращает следующие результаты:
row_num | id | name | admin1 | admin3 | admin4
-------------------------------------------------------------------------
2 | 2652355 | Cornwall | ENG | |
1 | 11609029 | Cornwall | ENG | |
Теперь, когда я добавляю этот запрос какПодзапрос и использовать MIN, чтобы выбрать строку с самым низким row_num Я получаю неправильные результаты:
SELECT MIN(t0.row_num),
t0.id,
t0.name,
t4.name AS town_admin4,
t3.name AS county_admin3,
t1.name AS admin1
FROM (
SELECT @row_num:=2 as row_num, id, name, admin1, admin3, admin4
FROM locations
WHERE feature_class IN ('P', 'A')
AND name LIKE 'cornwall%'
UNION ALL
SELECT @row_num:=1 as row_num , id, name, admin1, admin3, admin4
FROM locations
WHERE feature_class = 'L' AND feature_code = 'RGN'
AND name LIKE 'cornwall%'
) t0
LEFT JOIN locations t1 ON t1.admin1 = t0.admin1 AND t1.feature_code = 'ADM1'
LEFT JOIN locations t3 ON t3.admin3 = t0.admin3 AND t3.feature_code = 'ADM3'
LEFT JOIN locations t4 ON t4.admin4 = t0.admin4 AND t4.feature_code = 'ADM4'
GROUP BY t0.name,
t4.name,
t3.name,
t1.name
ORDER BY t0.name
Я получаю следующие результаты:
MIN(t0.row_num) | id | name | town_admin4 | county_admin3 | admin1
--------------------------------------------------------------------------------------------
1 | 2652355 | Cornwall | | | England
Как вы можете видеть выше, неверно.Строка 1 должна быть записана с идентификатором 11609029
Почему он ведет себя так - почему оператор MIN работает не так, как ожидалось?