Truy vấn ban đầu của bạn khá thông minh. Đây là một cách tiếp cận hơi khác. Nó lấy khu vực tiếp theo trong một truy vấn con (sử dụng một truy vấn con tương quan như trong ví dụ của bạn). Sau đó, nó sẽ đếm các hàng có các điều kiện là đúng:
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;
Truy vấn này đắt hơn truy vấn của bạn. Bạn đã có thể sử dụng một điều kiện bình đẳng tốt đẹp trên order
cột. Ở đây, cần sắp xếp với limit
để nhận giá trị tiếp theo. Chỉ mục tổng hợp trên (order, area)
sẽ giúp hiệu suất.