Din ursprungliga fråga är ganska smart. Här är ett lite annorlunda tillvägagångssätt. Den får nästa område i en underfråga (med hjälp av en korrelerad underfråga som i ditt exempel). Den räknar sedan raderna där villkoren är sanna:
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;
Den här frågan är dyrare än din. Du kunde använda ett trevligt likhetsvillkor på order
kolumn. Här behövs en sortering med limit
för att få nästa värde. Ett sammansatt index på (order, area)
bör hjälpa prestanda.