MySQL选择分组整数的范围

标签 mysql range

我在数据库中存储了一些客户端号码、分配的 ip、routerIP、vlan 和区域

   No    |       ip         |      router     |   idZone   |   vlan  | 
---------------------------------------------------------------------
   9600  |   10.95.65.100   |   10.10.10.26   |     2      |   105   |
   9601  |   10.95.65.101   |   10.10.10.26   |     2      |   105   |
   9602  |   10.95.65.102   |   10.10.10.27   |     2      |   107   |
  16090  |    10.32.5.90    |   10.10.10.25   |     1      |   103   |
  16091  |    10.32.5.91    |   10.10.10.25   |     1      |   103   |
  16092  |    10.32.5.92    |   10.10.10.25   |     1      |   103   |
  16093  |    10.32.5.93    |   10.10.10.25   |     1      |   103   |
  16095  |    10.32.5.95    |   10.10.10.25   |     1      |   103   |
  20100  |   10.20.10.200   |   10.10.10.32   |     3      |   109   |

我需要按路由器、区域和 vlan 分组显示哪些客户端号码已在使用中,以获得如下信息:

 from  |    to   |     router     |   zone   |  vlan
-----------------------------------------------------
 9600  |   9601  |  10.10.10.26   |     2    |   105   |
 9602  |   9602  |  10.10.10.27   |     2    |   107   |
16090  |  16093  |  10.10.10.25   |     1    |   103   |
16095  |  16095  |  10.10.10.25   |     1    |   103   |
20100  |  20100  |  10.10.10.32   |     3    |   109   |

客户编号是唯一的,现在我的查询是这样的:

SELECT
    MIN( no ) AS start_no,
    MAX( no ) AS end_no,
    router,
    idZone,
    vlan
FROM
    address
GROUP BY
    router,
    idZone,
    vlan 

但是该查询没有考虑第一个和最后一个之间的缺失点,例如而不是

 from  |    to   |     router     |   zone   |  vlan
--------------------------------------------------------
16090  |  16093  |  10.10.10.25   |     1    |   103   |
16095  |  16095  |  10.10.10.25   |     1    |   103   |

我愿意

 from  |    to   |     router     |   zone   |  vlan
-----------------------------------------------------
16090  |  16095  |  10.10.10.25   |     1    |   103   |

这是错误的,因为数据库中不存在记录 16094

建议?

谢谢!

最佳答案

以下查询适用于所有情况:

(SELECT
    MIN( no ) AS start_no,
    MAX( no ) AS end_no,
    router,
    idZone,
    vlan
FROM
    address a1
    where exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no + 1) or
          exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no - 1)
GROUP BY
    router,
    idZone,
    vlan 
)
union
(select no as_no, no as end_no, router,idzone,vlan
from address a1
where not exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no + 1) and
      not exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no - 1)
GROUP BY
    router,
    idZone,
    vlan 
 )
   ORDER BY vlan

DEMO

union 之前的查询部分将返回所有具有连续client no 的组,而查询的另一部分将返回其他单个组。

关于MySQL选择分组整数的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54704627/

相关文章:

mysql - 查询数据库并显示

php - 如何从Windows连接到digitalocean中的mysql数据库

php - 如何在 DESC MySQL 中选择数字 5-10

子过程完成后,Excel VBA 全局范围变量超出范围

python - 使用 sympysolve 命令时显示一定范围内的解

Javascript 范围在 Firefox 上丢失空格?

sql - oracle sql开始范围结束范围与计数

mysql - 安装 MySQLdb python 2.7 64 位

python - 检查时间戳列是否在另一个数据帧的日期范围内

mysql - sql查询返回两条记录之和