Váš původní dotaz je docela chytrý. Zde je trochu jiný přístup. Získá další oblast v poddotazu (pomocí korelovaného poddotazu jako ve vašem příkladu). Poté spočítá řádky, kde jsou podmínky splněny:
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;
Tento dotaz je dražší než váš. U order
jste mohli použít pěknou podmínku rovnosti sloupec. Zde je potřeba řazení pomocí limit
abyste získali další hodnotu. Složený index na (order, area)
by měl pomoci výkonu.