Din oprindelige forespørgsel er ret smart. Her er en lidt anden tilgang. Den får det næste område i en underforespørgsel (ved hjælp af en korreleret underforespørgsel som i dit eksempel). Den tæller derefter rækkerne, hvor betingelserne er sande:
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;
Denne forespørgsel er dyrere end din. Du var i stand til at bruge en god lighedsbetingelse på order
kolonne. Her er en sortering nødvendig med limit
for at få den næste værdi. Et sammensat indeks på (order, area)
skal hjælpe med ydeevnen.