|
@@ -0,0 +1,54 @@
|
|
|
+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; -- 确保只选择不超过最大递归深度的结果
|
|
|
+
|