Twoje oryginalne zapytanie jest dość sprytne. Oto nieco inne podejście. Pobiera następny obszar w podzapytaniu (używając skorelowanego podzapytania, jak w twoim przykładzie). Następnie liczy wiersze, w których warunki są spełnione:
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;
To zapytanie jest droższe niż Twoje. Udało Ci się użyć ładnego warunku równości w order
kolumna. Tutaj potrzebne jest sortowanie z limit
aby uzyskać następną wartość. Złożony indeks na (order, area)
powinien pomóc w wydajności.