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;
寻找成环的数据
这是成环的数据
数据库如上,要求是根据在相同subnetrmUID下的rmUID(多个),在根据rmUID等于aEndrmUID并且aLevel为汇聚点,得到第一条数据a,根据数据a的zEndrmUID为条件获取到下一条数据b,在根据b的zEndrmUID获取到下一条数据,因为要找的成环的数据基本在rmUID的集合内,大致能确定循环的次数,但是我每次取的值(zEndrmUID)都是上一次查询后的数据,所以在这种循环里怎么取值和确定循环的次数,对了终止条件的话是最后一条数据的zEndrmUID等于第一条数据的aEndrmUID,等于就是成环的数据,不等于就是成链的数据,还需要把每次查找出来的数据添加到一张新的表内,还得给他们排序编号,有没有大手子帮我解答一下疑问啊?
不知道你这个问题是否已经解决, 如果还没有解决的话:我可以提供基本思路和部分代码实现,但是由于具体的数据库结构和数据表结构不明确,以及缺乏可供测试的数据,无法提供完整的、可运行的代码。以下是基本思路和代码实现的框架:
import MySQLdb
# 连接MySQL数据库
conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='password', db='mydb')
# 创建游标对象
cur = conn.cursor()
# 定义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()