123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- WITH RECURSIVE excluded_ips(ip) AS(
- SELECT 'ip20'
- UNION ALL
- SELECT 'ip21'
- ),
- ConnectedIPs AS (
- -- 递归基: 初始化起始 IP 和结束 IP
- -- 这些是递归查询的起点
- SELECT
- 1 AS level, -- 记录当前递归层级(初始为1)
- 'ip0' AS from_ip, -- 起始 IP
- NULL AS to_ip, -- 初始时没有 to ip
- 0 AS addition_info -- 初始时没有标记为连接数过多
- UNION ALL
- SELECT
- 1 AS level, -- 记录当前递归层级(初始为1)
- 'ip1' AS from_ip, -- 起始 IP
- NULL AS to_ip, -- 初始时没有 to ip
- 0 AS addition_info -- 初始时没有标记为连接数过多
- -- 递归步骤:查找与已知 IP 相连的其他 IP
- UNION ALL
- SELECT
- ConnectedIPs.level + 1 AS level, -- 下一层级的递归层级(当前层级+1)
- ConnectedIPs.from_ip AS from_ip, -- 当前层级的 from ip
- table_01.to_ip AS to_ip, -- 新的 to ip
- CASE
- -- 检査当前 IP 的连接数是否超过s
- WHEN (SELECT COUNT(*) FROM table_01 WHERE table_01.from_ip = ConnectedIPs.from_ip OR table_01.to_ip = ConnectedIPs.from_ip) >= 5 THEN 1
- ELSE 0
- END AS addition_info
- FROM ConnectedIPs
- JOIN table_01 ON (table_01.from_ip = ConnectedIPs.from_ip OR table_01.to_ip = ConnectedIPs.from_ip)
- -- 递归条件:确保递归深度不超过最大值并且新Ip不在排除列表中
- WHERE ConnectedIPs.level < 5 -- 最大递归深度为5
- AND NOT EXISTS (SELECT 1 FROM excluded_ips WHERE excluded_ips.ip = table_01.from_ip OR excluded_ips.ip = table_01.to_ip)
- )
- -- 选择最终结果
- SELECT
- ConnectedIPs.level,
- ConnectedIPs.from_ip,
- ConnectedIPs.to_ip,
- NULL AS unique_hash, -- 需要替换为你实际的 unique hash 生成逻辑
- CURRENT_TIMESTAMP AS time, -- 当前时间戳作为时间字段
- NULL AS data, -- 需要替换为你实际的数据
- NULL AS from_pos, -- 需要替换为你实际的位置信息
- NULL AS to_pos, -- 需要替换为你实际的位置信息
- ConnectedIPs.addition_info -- 标记是否连接数过多
- FROM ConnectedIPs
- WHERE ConnectedIPs.level <= 5; -- 确保只选择不超过最大递归深度的结果
|