在MySQL中根据特定条件选择“下一行”

时间:2013-07-25 23:24:58

标签: mysql

我有这组数据,需要根据“下一个”逻辑行中的内容进行查询。

 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和订单没有递增,一些数据已被删除,然后重新添加。

如果给出这个新数据集,如何再次编写相同的查询?

1 个答案:

答案 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)上的综合索引应该有助于提高绩效。