对于零值间隙和非零值孤岛,如何解决 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

现在,让我们来看看如何解决您面临的问题。

  1. 去掉零,因为你在输出中不需要它们。
  2. 破解这个问题所需要做的就是一些会随着岛屿的不同而变化的值。这就是“rownum - row_number()”在这里的目的。

如果您还有问题,请随时提问

这里dbfiddle要检查