Votre requête initiale est plutôt intelligente. Voici une approche légèrement différente. Il obtient la zone suivante dans une sous-requête (en utilisant une sous-requête corrélée comme dans votre exemple). Il compte ensuite les lignes où les conditions sont vraies :
select sum(case when area = 'Front' and nextarea = 'Back' then 1 else 0 end)
from (SELECT t1.*,
(SELECT t2.area
FROM table t2
where t2.order > t1.order
order by t2.order
limit 1
) as nextarea
FROM table t1;
Cette requête est plus chère que la vôtre. Vous avez pu utiliser une belle condition d'égalité sur la order
colonne. Ici, un tri est nécessaire avec la limit
pour obtenir la valeur suivante. Un index composite sur (order, area)
devrait améliorer les performances.