MYSQL中递归存储过程获取分层数据的性能

2023-12-03

我有餐桌员工,
员工 ( emp_id int 主键, emp_name varchar(50), mngr_id int)

这里 mngr_id 要么为 null,要么包含有效的 emp_id。这样就形成了组织中员工的层次结构。

为了遍历整个层次结构,我必须编写递归存储过程。 (在 Oracle 中,使用 CONNECT BY .. START WITH 很容易)

所以问题是,考虑到层次结构的级别不会超过 10 级,这种存储过程对性能有何影响!

还有其他方法可以达到同样的效果吗?


一个相当简单的迭代邻接列表数据库服务器端解决方案:http://pastie.org/1056977

delimiter ;

drop procedure if exists employee_hier;

delimiter #

create procedure employee_hier
(
in p_emp_id smallint unsigned
)
begin

declare p_done tinyint unsigned default(0);
declare p_depth smallint unsigned default(0);

create temporary table hier(
 boss_id smallint unsigned, 
 emp_id smallint unsigned, 
 depth smallint unsigned
)engine = memory;

insert into hier values (null, p_emp_id, p_depth);

/* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */

create temporary table emps engine=memory select * from hier;

while p_done <> 1 do

    if exists( select 1 from employee e inner join hier on e.boss_id = hier.emp_id and hier.depth = p_depth) then

        insert into hier select e.boss_id, e.emp_id, p_depth + 1 
            from employee e inner join emps on e.boss_id = emps.emp_id and emps.depth = p_depth;

        set p_depth = p_depth + 1;          

        truncate table emps;
        insert into emps select * from hier where depth = p_depth;

    else
        set p_done = 1;
    end if;

end while;

select 
 e.emp_id,
 e.name as emp_name,
 b.emp_id as boss_emp_id,
 b.name as boss_name,
 hier.depth
from 
 hier
inner join employee e on hier.emp_id = e.emp_id
inner join employee b on hier.boss_id = b.emp_id;

drop temporary table if exists hier;
drop temporary table if exists emps;

end #

delimiter ;


call employee_hier(1);
call employee_hier(3);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MYSQL中递归存储过程获取分层数据的性能 的相关文章

  • 仅当值发生更改时如何插入数据库?

    我需要更新 替换 MySQL 数据库中的字段 但前提是它们已更改 该表包含 ID 文本字段和更改日期 用户根据更改日期通过 ID 查询数据 即 如果该日期早于用户上次查询数据的时间 则他不想要它 仅当文本字段与具有相同 ID 的现有文本字段
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • 连接 Netbeans 和 MySQL 但出现大整数错误

    所以我正在尝试向我的 Netbeans 数据库 即 MySQL 添加新连接 但我遇到了大整数转换错误 有人可以帮助我吗 详细地 我右键单击现有的MySQL 服务器位于 localhost 3306 root 已断开连接 gt gt 选择co
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • db:schema:load 与 db:migrate 使用 capistrano

    我有一个 Rails 应用程序 我正在将其移动到另一台服务器 我认为我应该使用 db schema load 来创建 mysql 数据库 因为这是推荐的 我的问题是我正在使用 capistrano 进行部署 并且它似乎默认为 rake db
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • mysql转储到derby

    我正在使用 derby 在 eclipse 中进行开发 是否可以从 MySQL 转储表并以某种方式将其用于 derby 我知道 ddl 和 dml 对于两个 dbms 来说是不同的 但我正在寻找一种除了转储 导出之外的合适方法 我可以找到两
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 如何从批量数据中的mysql列中删除所有非数字字符

    我想从列中删除所有非数字字符 我的数据库中有大量数据 目前我正在使用以下链接中描述的方法 http venerableagents wordpress com 2011 01 29 mysql numeric functions http
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val

随机推荐

  • Access 2010 限制查询结果

    MS Access 2010 中用于将查询结果限制为前 1 000 个的语法是什么 我试过这个 SELECT tblGL Cost Centre Code FROM tblGL LIMIT 1000 但我收到错误 FROM 子句中的语法错误
  • 有什么方法可以控制 blockproc 输出的串联吗?

    这是问题的后续 使用 blockproc 或 im2col 在图像上重叠滑动窗口 所以通过使用代码 B blockproc A 1 1 block fun BorderSize 2 2 TrimBorder false PadPartial
  • 使用 geom_line 连接缺失值

    我试图弄清楚是否可以使用 geom line 连接缺失值 例如 在下面的链接中 构面 F 中的时间 3 处缺少值 在这种情况下 我想要一条线来连接时间 2 和 4 有办法实现这一点吗 https farm8 staticflickr com
  • 从自定义表格视图单元格发送重新加载数据?

    我将如何从自定义 tableViewCell 向 tableView 发送 reloadData 消息 实现这一点的最简单方法是使用委托 在 CustomTableCell h 中定义一个协议 如下所示 protocol CustomTab
  • 递归 - 数字按相反顺序排列

    我需要实现一个递归方法 printDigits 它将整数 num 作为参数 并以相反的顺序打印其数字 每行一位数字 这是我到目前为止所拥有的 public class PrintDigits public static void main
  • 启动层初始化时发生错误 FindException: Module not found

    使用 Java 9 执行简单的 Hello World 程序会导致以下错误消息 boot层初始化时出错java lang module FindException 找不到模块 com pantech myModule 我执行的命令行是 ja
  • 使用 VBA 宏在 CATIA V5R19 中实例化 PowerCopy

    我不知道如何使用 VBA 宏实例化 Power copy 我有一个 CATPart1 其 Power copy 名称为 MyPC 我想在当前部分实例化这个超级副本 仅举例来说 此超级复制输入为 Plane Start point 和 End
  • 查找“立体校正”两个摄像机之间的旋转矩阵

    所以我有一个深度图以及相机的外部和内部 我想取回 3D 点和表面法线 我正在使用该函数重新投影图像至 3D 在stereo rectify函数中找到Q如何得到旋转矩阵between第一和第二相机的坐标系 我有单独的旋转矩阵和平移向量 但如何
  • Android Studio:使用 Mongo Java 驱动程序连接到 MongoDB 服务器

    关于这个问题有很多帖子 但似乎没有人能解决问题 所以也许有些事情已经改变了 我正在尝试将我的 Android 应用程序连接到位于 mLab 上的 MongoDB 服务器 我正在使用 Mongo Java Drived 当然已经将库添加到了
  • Vera ++ TCL规则:列出所有局部变量[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在尝试为 vera 静
  • Datagrid (WPF) 以编程方式设置列样式(不是 xaml)

    我已经看过了 但还没有找到我正在寻找的确切答案 我有一个绑定到数据源的 DataGrid 视图 我想在带有数据网格的窗口可见后以编程方式设置列的样式 我也想根据一些行为时不时地改变它 我尝试使用 DataGridTemplateColumn
  • 如何在C#中删除注册表值

    我可以使用 Microsoft Win32 Registry 类获取 设置注册表值 例如 Microsoft Win32 Registry SetValue HKEY CURRENT USER Software Microsoft Wind
  • 为我的条形码阅读器读取和写入数据到缓冲区的最佳方法是什么?

    我需要用 C 语言为 Linux 的条形码阅读器编写一个驱动程序 条形码阅读器通过串行总线工作 当我向条形码阅读器发送一组命令时 条形码阅读器应该向我返回状态消息 我设法配置端口并创建信号处理程序 在信号处理程序中 我读取串行总线接收的数据
  • 如何搜索在 Json 中注册为数组的日期?

    如何搜索在 Json 中注册为数组的日期 PostgreSQL 是数据库 下面是相关代码 1 Model class Business db Model tablename business id db Column db Integer
  • GitHub api 获取最后 N 次提交

    是否可以使用 GitHub API 获取 GitHub 存储库中特定分支的最后 N 次提交 我刚刚发现了一些关于提交的 GitHub api 详细信息here 但他们都没有提供有关最后 N 次提交的详细信息 任何人都可以对此提供更好的想法吗
  • 具体详细说明了 NSUserDefaultsDidChangeNotification 上的默认值已更改的内容

    我开始进入 NSUserDefaults 的内部密室 现在我可以使用提供的选择器加上 NSNotification 对象作为参数成功拦截 NSUserDefaultsDidChangeNotification 通知 然而 返回的 NSNot
  • R-lang:如果等于引号,则删除第一个字符

    R新手 我正在尝试从数据框中的行的开头和结尾删除 如果引号不是第一个或最后一个字符 我不想删除 我不确定为什么以下内容不适用于我的数据的数据框 其中每一行都是文本的数据点 引号并不是字符串 而是文本的一部分 数据框的一行看起来像这样 x l
  • 在 bash 中获取当前日期而不生成子进程

    这个问题纯粹是好奇心 通过运行以下命令很容易获得日期date来自 bash 的命令 但它是一个外部可执行文件 需要生成一个子进程 我想知道是否可以在没有子进程的情况下获取当前时间 日期的格式 我只能在以下上下文中找到对日期 时间格式的引用P
  • RabbitMQ 消费者过载

    我一直在阅读有关 AMQP 消息传递确认的原理 https www rabbitmq com confirms html 确实很有帮助且写得很好的文章 但有关消费者致谢的一个特别的事情确实令人困惑 以下是引用 使用自动确认模式时需要考虑的另
  • MYSQL中递归存储过程获取分层数据的性能

    我有餐桌员工 员工 emp id int 主键 emp name varchar 50 mngr id int 这里 mngr id 要么为 null 要么包含有效的 emp id 这样就形成了组织中员工的层次结构 为了遍历整个层次结构 我