zoukankan      html  css  js  c++  java
  • SQL递归查询

    mysql8.0

    准备表结构

    CREATE TABLE `function`  (
      `Id` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'Id',
      `CreateTime` datetime(0) NOT NULL COMMENT '创建时间',
      `ModifyTime` timestamp(0) NOT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间',
      `Name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '名称',
      `ParentId` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '上级功能Id',
      `Icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '图标',
      `Type` int(11) NOT NULL COMMENT '功能类型',
      `Sort` int(11) NOT NULL COMMENT '类型',
      `Path` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '路径',
      `Describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '描述',
      `Flag` bigint(20) NOT NULL COMMENT '标记',
      `Classify` int(10) NOT NULL COMMENT '所属系统分类',
      PRIMARY KEY (`Id`) USING BTREE,
      UNIQUE INDEX `Index_Function_PathClassify`(`Path`, `Classify`) USING BTREE COMMENT '每个系统路径是唯一的'
    ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;

    准备数据

    INSERT INTO `function` VALUES ('1', '2019-07-08 16:03:29', '2019-07-08 16:03:31', '人力', '0', '/', 1, 1, '/a', '1', 0, 0);
    INSERT INTO `function` VALUES ('10', '2019-07-08 16:22:54', '2019-07-08 16:22:55', '企业资源', '3', '/qi', 1, 1, '/qi', NULL, 0, 0);
    INSERT INTO `function` VALUES ('2', '2019-07-08 16:06:55', '2019-07-08 16:06:57', '员工', '1', '/', 1, 1, '/c', '1', 0, 0);
    INSERT INTO `function` VALUES ('3', '2019-07-08 16:07:48', '2019-07-08 16:07:50', '组织', '1', '/', 1, 1, '/d', '1', 0, 0);
    INSERT INTO `function` VALUES ('4', '2019-07-08 16:08:28', '2019-07-08 16:08:31', '考勤', '1', '', 1, 1, '/dsa', '1', 0, 0);
    INSERT INTO `function` VALUES ('5', '2019-07-08 16:08:53', '2019-07-08 16:09:27', '设备', '4', '/ss', 1, 1, '/3', '1', 0, 0);
    INSERT INTO `function` VALUES ('6', '2019-07-08 16:18:04', '2019-07-08 16:18:06', '打野', NULL, '/da', 1, 12, '/daa', NULL, 0, 1);
    INSERT INTO `function` VALUES ('7', '2019-07-08 16:19:52', '2019-07-08 16:19:55', '员工成员', '2', '/a', 1, 14, '/aa', '1', 0, 0);
    INSERT INTO `function` VALUES ('8', '2019-07-08 16:21:29', '2019-07-08 16:21:32', '员工家庭', '2', '/j', 1, 2, '/jt', '', 0, 0);
    INSERT INTO `function` VALUES ('9', '2019-07-08 16:22:18', '2019-07-08 16:22:20', '员工微信部落', '2', '/wx', 1, 1, '/wx', NULL, 0, 0);

    全表数据展示

    根据父级Id递归查询所有子节点(查询父级Id为0 并且分类为0的所有子节点)

    WITH RECURSIVE _children AS
    (
     SELECT fun.* FROM `function` fun WHERE fun.ParentId='0' AND Classify = 0
        UNION ALL
     SELECT fun.* FROM _children,`function` fun WHERE fun.ParentId=_children.Id
    )
    SELECT * FROM _children;

    根据子节点查询所有父亲节点(查询子节点Id为9的所有父节点)

    WITH RECURSIVE _parent AS
    (
     SELECT fun.* FROM `function` fun WHEREfun.Id='9' 
        UNION ALL
     SELECT fun.* FROM _parent,`function` fun WHERE fun.Id=_parent.ParentId
    )
    SELECT * FROM _parent;

     mysql5.0参考: https://www.cnblogs.com/xiaoxi/p/5942805.html

    sqlserver 在mysql8.0基础上去掉RECURSIVE关键字即可

    WITH _children AS
    (
     SELECT fun.* FROM `function` fun WHERE fun.ParentId='0' AND Classify = 0
        UNION ALL
     SELECT fun.* FROM _children,`function` fun WHERE fun.ParentId=_children.Id
    )
    SELECT * FROM _children;
    
    WITH _parent AS
    (
     SELECT fun.* FROM `function` fun WHERE fun.Id='9' 
        UNION ALL
     SELECT fun.* FROM _parent,`function` fun WHERE fun.Id=_parent.ParentId
    )
    SELECT * FROM _parent;

     mysql5.7

    select  id,
            name,
            parent_id 
    from    (select * from products
             order by parent_id, id) products_sorted,
            (select @pv := '19') initialisation
    where   find_in_set(parent_id, @pv)
    and     length(@pv := concat(@pv, ',', id))
  • 相关阅读:
    驱动_spi驱动框架
    代码示例_陀螺仪_I2C
    控制台查看 pip 版本的指令
    更新升级(upgrade) pip 出错问题解决
    105. 从前序和中序遍历序列构造二叉树
    TCP初步了解
    Java GUI 之 JSplitPane
    URL的含义
    JPanel与JFrame的关系
    IDEA禁用函数名拼写错误提示
  • 原文地址:https://www.cnblogs.com/liuxiaoji/p/11152094.html
Copyright © 2011-2022 走看看