Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择';下一个';MySQL中给定特定条件的行_Mysql - Fatal编程技术网

选择';下一个';MySQL中给定特定条件的行

选择';下一个';MySQL中给定特定条件的行,mysql,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

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

 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和顺序没有增加,一些数据已经被删除,然后重新添加


鉴于这个新的数据集,我如何再次编写相同的查询?

您原来的查询相当聪明。这里有一个稍微不同的方法。它获取子查询中的下一个区域(如示例中所示,使用相关子查询)。然后对条件为真的行进行计数:

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
进行排序以获得下一个值。
(订单、区域)
上的综合索引应该有助于提高性能。

谢谢@GordanLinoff-我真的避开了这个()。我立刻看到了答案。很高兴能有我最初的方式,但附议@杰克·诺布尔。我以前没听过这个词。很好,我也经常经历。有什么想法@GordonLinoff?-我的方法似乎失败了。