我在mysql中有一个数字列表
column 1 column2 column 3
4
6
7
88
21
29
30
31
如何获得所有顺序块,结果应为
6
7
29
30
31
答案 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
您可以根据需要使用排序方向。