mysql – 在列表模型中查找深度
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 在列表模型中查找深度,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2330字,纯文字阅读大概需要4分钟。
内容图文
我的生产数据看起来类似于此处解释的邻接列表模型…
http://mysql.stu.edu.tw/tech-resources/articles/hierarchical-data.html
我的问题是如何知道嵌套有多深?在这种情况下,从最后一个叶子“Flash”到第一个节点“Electronics”是4.是否有返回此最大深度数的查询?
解决方法:
MYSQL没有CTE也没有递归功能.你可以用’经典循环’来解决它:
DELIMITER $$
DROP FUNCTION IF EXISTS figure_up_depth $$
--encapsulated as a function:
CREATE FUNCTION figure_up_depth(idToSearch INT) RETURNS INT BEGIN
--var to count steps from node to root:
DECLARE depth INT;
SET depth = 1;
--while we are not on root node:
WHILE ( idToSearch is not null) DO
SET idToSearch = ( select parent
from category
where category_id = idToSearch
);
SET depth = depth + 1;
END WHILE;
RETURN depth;
END;
$$
DELIMITER ;
检查:
mysql> select figure_up_depth(7);
+--------------------+
| figure_up_depth(7) |
+--------------------+
| 4 |
+--------------------+
1 row in set (0.00 sec)
2015年7月8日编辑
我意识到OP要求最大深度,而不是节点深度.一个简单的:
mysql> select max( figure_up_depth(category_id) ) as max_depth
from category;
如果性能重要,正确的解决方案是:
>将所有categories.parent放在临时表table1中.
>使用categories.id = table1.id将table1与类别连接,将结果连接字段categories.parent放在临时表table2上.
>删除table1并将table2重命名为table1.
>如果table1有行,请执行步骤2.
循环次数迭代将是树深度:
DELIMITER $$
DROP PROCEDURE IF EXISTS letsgo;
CREATE PROCEDURE letsgo() BEGIN
DECLARE R int;
DECLARE D int;
SET D=0;
DROP TEMPORARY TABLE IF EXISTS children;
CREATE TEMPORARY TABLE children AS (SELECT category_id as id
FROM category
WHERE parent is NULL );
DROP TEMPORARY TABLE IF EXISTS children_prev;
CREATE TEMPORARY TABLE children_prev AS (SELECT * FROM children );
SET R = ( SELECT count(*) FROM children );
WHILE ( R > 0 ) DO
DROP TEMPORARY TABLE IF EXISTS children_aux;
CREATE TEMPORARY TABLE children_aux AS (
SELECT category_id as id
FROM category R
INNER JOIN children_prev C on C.id = R.parent
);
SET R = ( SELECT count(*) FROM children_aux );
INSERT INTO children
SELECT * FROM children_aux;
TRUNCATE TABLE children_prev;
INSERT INTO children_prev
SELECT * FROM children_aux;
SET D=D+1;
END WHILE;
SELECT D;
END;
$$
DELIMITER ;
测试:
mysql> call letsgo();
+------+
| D |
+------+
| 4 |
+------+
1 row in set (0.14 sec)
注意:抱歉脏解决方案,这是mysql:没有CTE,没有递归,没有选择函数递归,没有DO-While,…
内容总结
以上是互联网集市为您收集整理的mysql – 在列表模型中查找深度全部内容,希望文章能够帮你解决mysql – 在列表模型中查找深度所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。