Su consulta original es bastante inteligente. Aquí hay un enfoque ligeramente diferente. Obtiene la siguiente área en una subconsulta (usando una subconsulta correlacionada como en su ejemplo). Luego cuenta las filas donde las condiciones son verdaderas:
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 es más cara que la tuya. Pudiste usar una buena condición de igualdad en el order
columna. Aquí, se necesita una ordenación con el limit
para obtener el siguiente valor. Un índice compuesto en (order, area)
debería ayudar al rendimiento.