我有这组数据,需要根据“下一个”逻辑行中的内容进行查询。
id | area | order
1 front 1
2 back 2
3 left 3
4 middle 4
5 right 5
我有一个这样的查询来计算前区跟后面区域的实例数
SELECT
(SELECT COUNT(id)
FROM table AS t2
WHERE t2.area = 'back' AND t2.order = (t1.order +1)) AS c,
FROM table AS t1
WHERE t1.area = 'front'
但是,数据集现在已经改变,可能看起来像这样
id | area | order
1 front 1
2 back 3
4 left 4
6 middle 7
9 right 9
现在ID和订单没有递增,一些数据已被删除,然后重新添加。
如果给出这个新数据集,如何再次编写相同的查询?
答案 0 :(得分:1)
您的原始查询相当聪明。这是一种略有不同的方法。它获取子查询中的下一个区域(使用与示例中相关的子查询)。然后它计算条件为真的行:
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;
此查询比您的查询更昂贵。您可以在order
列上使用良好的相等条件。在这里,limit
需要排序才能获得下一个值。 (order, area)
上的综合索引应该有助于提高绩效。