MySQL 如何仅用一条SQL语句或存储过程或自定义函数 判断两条记录之间是否存在层级关联 10C

图片说明

表格不止四个,还可能有表E、F、G。

数据库表之间的关系如图,子表的每条记录通过'parent_id'和'parent_table'两个属性指向父表的一条记录。所有表均包含这两个属性(A表中该值为空)。

如何只用一条SQL语句(或者写一个存储过程、自定义函数)用以判断任意两条记录之间知否有层级间的从属关系?

我尝试用动态执行SQL语句和递归去实现,但是由于技艺不精都失败了。请问各位大大这可如何是好啊~

3个回答

有点像无限极分类, 不知道具体几层, 用递归弄

lgj123xj
猿长大人 回复qq_39522549: 嗯嗯,已经解决啦,多谢你的提醒~
8 个月之前 回复
qq_39522549
qq_39522549 回复猿长大人: mysql函数不能用递归,存储过程可以,但是默认禁用了。需要SET @@SESSION.max_sp_recursion_depth=25。
8 个月之前 回复
lgj123xj
猿长大人 是想用递归的,但是只能使用SQL全部在数据库内实现。动态执行SQL语句又取不出数据,所以卡住了~
8 个月之前 回复

通过函数的方式判断两条记录是否存在层级关联

CREATE FUNCTION is_relation(类型 parent_id1,类型 parent_table1,类型 parent_id2,类型 parent_table2)
BEGIN
#判断纪录1是否与纪录2相关联
SELECT parent_id,parent_table INTO @pi,@pt FROM parent_table1 WHERE parent_id=parent_id1;
WHILE @pi IS NOT NULL
DO
IF @pi=parent_id2 THEN
RETURN 1;
END IF;
SELECT parent_id,parent_table INTO @pi,@pt FROM parent_table1 WHERE parent_id=@pi;
END WHILE;

#判断纪录2是否与纪录1相关联
...
类似于1
...

RETURN 0;
END

代码未补全只理了个思路,应该是可以实现的

lgj123xj
猿长大人 感谢您的回答,两条数据之间相隔的表格的级数并不能确定,可能存在关联也可能不存在。这个问题我昨天已经解决了,使用了动态执行SQL+递归存储过程。原本想发出来分享实现的具体代码,但是开发中由于其中还杂糅了其他的一些功能配合使用,不是很好分离这部分的代码,所以没有暂时没有发出来分享。还是感谢你的帮助~
8 个月之前 回复

看我理解的对不对。

不同的级别存在不同的表里边,指定表中某一个字段存有下一级级别的数据。

例如:
你画的图有4个级别,分别对应4个表。
级别1对应表1,某个字段存有级别2的数据;
级别2对应表2,某个字段存有级别3的数据;
级别3对应表3,某个字段存有级别4的数据;
级别4对应表4。。。。

假如有新的级别,就对应出现新的表,而且表名、存储字段的级别都有顺序。

你都说了不知道属于哪个级别,还要查询2条数据是否有对应关系。
可以先用循环先遍历一遍所有级别的表,查询一条数据是在哪个具体的表里边,然后再去上下2个级别的表去查询另一条数据是否存在就好了。

lgj123xj
猿长大人 感谢您的回答,两条数据之间相隔的表格的级数并不能确定,可能存在关联也可能不存在。这个问题我昨天已经解决了,使用了动态执行SQL+递归存储过程。原本想发出来分享实现的具体代码,但是开发中由于其中还杂糅了其他的一些功能配合使用,不是很好分离这部分的代码,所以没有暂时没有发出来分享。还是感谢你的帮助~
8 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!