首页 > 解决方案 > MySQL获取表中的连续数字块

问题描述

表名:列表

列名:NPA、nxx、xxxx

目标:表由数千个条目组成。我想搜索并获取特定 npa 的连续顺序 100 xxxx,nxx。

Xxxx 值的范围从 0001 到 9999。但是该范围内的某些数字不存在。因此,我想找到第一个连续 100 个数字块。

我已经尝试了一些类似问题的建议和解决方案中提供的几种方法,但似乎都没有奏效。

任何帮助将非常感激

标签: phpmysql

解决方案


您可以通过使用变量分配块号和行号来做到这一点,例如,如果我正在寻找 2 个连续数字的第一个块

DROP TABLE IF EXISTS T;
CREATE TABLE T (NXX VARCHAR(1), XXX INT);
INSERT INTO T VALUES
('A',1),('A',3),('A',4),('A',6),('A',7),('A',8),
('b',1),('b',2),('b',3),('b',4),('b',5),('b',6);

select x.nxx,x.xxx from
(
select s.nxx,min(s.block) block
from
(
SELECT T.NXX,T.XXX,
         IF(T.NXX <> @PNXX OR T.XXX > @PXXX + 1 ,@B:=@B+1,@B:=@B) BLOCK,
         IF(T.NXX <> @PNXX OR T.XXX > @PXXX + 1 ,@RN:=1,@RN:=@RN+1) RN,
         if(@rn = 2,@lim:=1,@lim:=0) lim,
         @PNXX:= T.NXX PNXX,
         @PXXX:= T.XXX PXXX
FROM T
CROSS JOIN(SELECT @RN:=0,@B:=0,@PNXX:='', @PXXX:=0,@lim:=0) R
ORDER BY T.NXX,T.XXX
) s 
where s.lim = 1
group by s.nxx
) w
join
(
SELECT T.NXX,T.XXX,
         IF(T.NXX <> @PNXX_1 OR T.XXX > @PXXX_1 + 1 ,@B1:=@B1+1,@B1:=@B1) BLOCK,
         IF(T.NXX <> @PNXX_1 OR T.XXX > @PXXX_1 + 1 ,@RN1:=1,@RN1:=@RN1+1) RN,
         if(@rn1 = 2,@lim1:=1,@lim1:=0) lim,
         @PNXX_1:= T.NXX PNXX,
         @PXXX_1:= T.XXX PXXX
FROM T
CROSS JOIN(SELECT @RN1:=0,@B1:=0,@PNXX_1:='', @PXXX_1:=0,@lim1:=0) R
ORDER BY T.NXX,T.XXX
) x on x.block = w.block and x.rn <= 2
order by x.block,x.nxx,x.xxx;

在子查询 s 计算出块以及是否已达到 2 个连续数字的情况下,导出 nxx 的最小块并连接到另一个子查询,该子查询提取所需的块

+------+------+
| nxx  | xxx  |
+------+------+
| A    |    3 |
| A    |    4 |
| b    |    1 |
| b    |    2 |
+------+------+
4 rows in set (0.23 sec)

推荐阅读