Вот способ сделать это только с одной группой:
set @row := 0;
select name, area, sliced
from (
select name, area, (@row := @row + 1) = 1 as sliced
from (
SELECT p.name, SUM(c.area) AS area
FROM City AS c
INNER JOIN Province AS p ON c.province_id = p.id
INNER JOIN Region AS r ON p.region_id = r.id
WHERE r.id = ?
GROUP BY 1
ORDER BY 2 desc) t1
) t2
order by 1;
Внутренний запрос (t1
) сначала группирует и сортирует по общей площади.
Следующий запрос (t2
) дает первой строке значение true
для столбца sliced
, все остальные строки false
.
Внешний запрос упорядочивает строки так, как вы хотите - по имени.
Поскольку существует только одна таблица сканирования и группировки, это должно быть очень эффективно.