对于零值间隙和非零值孤岛,如何解决 mysql 中的间隙和孤岛问题
How can I solve gaps and islands problem in mysql for gaps with zero values and islands with non-zero values
我读了很多关于 MySQL 间隙和孤岛问题的文章,但我找不到足够接近的内容来理解我的问题。我从 zeros 和 islands 从 15 开始有差距。你可以在下面看到我在说什么 tables 第一个 table 是我的数据:
CREATE TABLE gapsandislands (
rownum int(11) NOT NULL,
integer_id int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO gapsandislands (rownum, integer_id) VALUES
(1, 0),
(2, 0),
(3, 0),
(4, 0),
(5, 15),
(6, 15),
(7, 15),
(8, 15),
(9, 15),
(10, 15),
(11, 15),
(12, 15),
(13, 0),
(14, 0),
(15, 0),
(16, 0),
(17, 0),
(18, 0),
(19, 0),
(20, 0),
(21, 15),
(22, 15),
(23, 15),
(24, 15),
(25, 0),
(26, 0),
(27, 0);
我在这个例子中的岛屿是 5-12 和 21-24。但是如何在新的 table 中管理它们?
如果我做对了,这会对你有所帮助
with no_zeroes as (
select rownum, integer_id, rownum - row_number() over(order by rownum) gaps_detector
from gapsandislands
where integer_id > 0
)
select min(rownum) start_ruwnum, max(rownum) end_rownum
from no_zeroes
group by gaps_detector
如果您使用的 mysql 低于 8 的版本不支持 CTE(“with”部分),请将查询从中复制到“from”部分作为子查询
select min(rownum) start_ruwnum, max(rownum) end_rownum
from (select rownum, integer_id, rownum - row_number() over(order by rownum) gaps_detector
from gapsandislands
where integer_id > 0)no_zeroes
group by gaps_detector
现在,让我们来看看如何解决您面临的问题。
- 去掉零,因为你在输出中不需要它们。
- 破解这个问题所需要做的就是一些会随着岛屿的不同而变化的值。这就是“rownum - row_number()”在这里的目的。
如果您还有问题,请随时提问
这里dbfiddle要检查
我读了很多关于 MySQL 间隙和孤岛问题的文章,但我找不到足够接近的内容来理解我的问题。我从 zeros 和 islands 从 15 开始有差距。你可以在下面看到我在说什么 tables 第一个 table 是我的数据:
CREATE TABLE gapsandislands (
rownum int(11) NOT NULL,
integer_id int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO gapsandislands (rownum, integer_id) VALUES
(1, 0),
(2, 0),
(3, 0),
(4, 0),
(5, 15),
(6, 15),
(7, 15),
(8, 15),
(9, 15),
(10, 15),
(11, 15),
(12, 15),
(13, 0),
(14, 0),
(15, 0),
(16, 0),
(17, 0),
(18, 0),
(19, 0),
(20, 0),
(21, 15),
(22, 15),
(23, 15),
(24, 15),
(25, 0),
(26, 0),
(27, 0);
我在这个例子中的岛屿是 5-12 和 21-24。但是如何在新的 table 中管理它们?
如果我做对了,这会对你有所帮助
with no_zeroes as (
select rownum, integer_id, rownum - row_number() over(order by rownum) gaps_detector
from gapsandislands
where integer_id > 0
)
select min(rownum) start_ruwnum, max(rownum) end_rownum
from no_zeroes
group by gaps_detector
如果您使用的 mysql 低于 8 的版本不支持 CTE(“with”部分),请将查询从中复制到“from”部分作为子查询
select min(rownum) start_ruwnum, max(rownum) end_rownum
from (select rownum, integer_id, rownum - row_number() over(order by rownum) gaps_detector
from gapsandislands
where integer_id > 0)no_zeroes
group by gaps_detector
现在,让我们来看看如何解决您面临的问题。
- 去掉零,因为你在输出中不需要它们。
- 破解这个问题所需要做的就是一些会随着岛屿的不同而变化的值。这就是“rownum - row_number()”在这里的目的。
如果您还有问题,请随时提问
这里dbfiddle要检查