Sua consulta original é bastante inteligente. Aqui está uma abordagem um pouco diferente. Ele obtém a próxima área em uma subconsulta (usando uma subconsulta correlacionada como no seu exemplo). Em seguida, ele conta as linhas em que as condições são verdadeiras:
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;
Esta consulta é mais cara que a sua. Você conseguiu usar uma boa condição de igualdade na
order
coluna. Aqui, uma classificação é necessária com o limit
para obter o próximo valor. Um índice composto em (order, area)
deve ajudar no desempenho.