从列表中获取所有顺序块

时间:2016-04-17 14:00:27

标签: mysql sql

我在mysql中有一个数字列表

column 1       column2            column 3
4 
6
7 
88
21
29
30 
31

如何获得所有顺序块,结果应为

6
7
29
30
31

3 个答案:

答案 0 :(得分:2)

这是使用自我加入和union的一种方式。

select t1.val
from t t1
join t t2 on t1.val = t2.val-1
union
select t2.val
from t t1
join t t2 on t1.val = t2.val-1
order by 1

编辑:我意识到这可以通过单个查询完成,而不是使用union

select distinct t1.val
from t t1
join t t2 on t1.val = t2.val-1 or t1.val = t2.val+1
order by 1

答案 1 :(得分:2)

您可以使用exists

select t.*
from t
where exists (select 1
              from t t2
              where t2.col1 = t.col1 + 1
             ) or
      exists (select 1
              from t t2
              where t2.col1 = t.col1 - 1
             ) ;

您可以将exists合并到一个子查询中:

select t.*
from t
where exists (select 1
              from t t2
              where t2.col1 in (t.col1 - 1, t.col1 + 1)
             );

第一个版本应该能够使用列上的索引。优化可能更难以为第二个使用索引。

另请注意,这些版本还允许您包含行中的其他列。

答案 2 :(得分:0)

我假设你想要排序只是为了获得你的第一列的值,如果不是我想编辑我的答案。因此,如果您只需要第一列的值,请按以下步骤操作:

SELECT column1 
FROM  `table` 
ORDER BY  `column1` ASC 

您可以根据需要使用排序方向。