查找成环的数据并添加到新表里


DROP TABLE IF EXISTS `hw_end`;
CREATE TABLE `hw_end`  (
  `rmUID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `subnetrmUID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `xPos` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `yPos` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `aEndname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `zEndname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `aEndrmUID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `zEndrmUID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `rate` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `direction` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `aLevel` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `zLevel` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

寻找成环的数据
这是成环的数据

img

数据库如上,要求是根据在相同subnetrmUID下的rmUID(多个),在根据rmUID等于aEndrmUID并且aLevel为汇聚点,得到第一条数据a,根据数据a的zEndrmUID为条件获取到下一条数据b,在根据b的zEndrmUID获取到下一条数据,因为要找的成环的数据基本在rmUID的集合内,大致能确定循环的次数,但是我每次取的值(zEndrmUID)都是上一次查询后的数据,所以在这种循环里怎么取值和确定循环的次数,对了终止条件的话是最后一条数据的zEndrmUID等于第一条数据的aEndrmUID,等于就是成环的数据,不等于就是成链的数据,还需要把每次查找出来的数据添加到一张新的表内,还得给他们排序编号,有没有大手子帮我解答一下疑问啊?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我可以提供基本思路和部分代码实现,但是由于具体的数据库结构和数据表结构不明确,以及缺乏可供测试的数据,无法提供完整的、可运行的代码。以下是基本思路和代码实现的框架:

    1. 首先,需要连接数据库并引入相关依赖库(比如MySQLdb)。示例如下:
    import MySQLdb
    
    # 连接MySQL数据库
    conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='password', db='mydb')
    # 创建游标对象
    cur = conn.cursor()
    
    1. 然后需要编写SQL语句,根据问题描述,可以使用循环语句(比如while)和嵌套查询来实现。示例如下:
    # 定义SQL语句,用来查找成环的数据并将其添加到新表
    sql = '''
    INSERT INTO new_table (rmUID, subnetrmUID, aEndrmUID, zEndrmUID, aLevel, zLevel, seq)
    SELECT rmUID, subnetrmUID, aEndrmUID, zEndrmUID, aLevel, zLevel, @rownum := @rownum + 1
    FROM (
        -- 第一条数据,a
        SELECT *
        FROM my_table
        WHERE rmUID IN (
            SELECT rmUID
            FROM my_table
            WHERE rmUID = aEndrmUID AND aLevel = '汇聚点'
            GROUP BY subnetrmUID, rmUID
        )
        ORDER BY rmUID
        LIMIT 1
    ) AS a
    -- 逐步获取后续的数据,直到成环或成链
    JOIN (
        -- 第二条数据,b
        SELECT *
        FROM my_table
        WHERE rmUID = a.zEndrmUID
    ) AS b
    ON a.zEndrmUID = b.aEndrmUID
    LEFT JOIN (
        -- 最后一条数据,用来判断是成环还是成链
        SELECT *
        FROM my_table
        WHERE rmUID = (
            SELECT aEndrmUID
            FROM (
                SELECT *
                FROM my_table
                WHERE rmUID IN (
                    SELECT rmUID
                    FROM my_table
                    WHERE rmUID = aEndrmUID AND aLevel = '汇聚点'
                    GROUP BY subnetrmUID, rmUID
                )
                ORDER BY rmUID
                LIMIT 1
            ) AS a
        )
    ) AS last
    ON b.zEndrmUID = last.aEndrmUID
    -- 设置结束条件,如果成环则last.aEndrmUID等于a.aEndrmUID,否则为NULL
    WHERE IFNULL(last.aEndrmUID, '') = a.aEndrmUID
    -- 定义排序规则
    ORDER BY rmUID
    '''
    
    # 执行SQL语句
    cur.execute(sql)
    # 提交事务
    conn.commit()
    
    # 关闭游标和数据库连接
    cur.close()
    conn.close()
    
    1. 注意,以上代码仅供参考,需要根据实际情况进行修改和测试,并确保SQL语句正确、有效、安全。同时,如果数据量较大,需要考虑分批查询和插入、优化查询性能等问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^