缅甸新锦江赌场-官方网站

English 浙江双荣电子
0577-62816098

产品分类

/PRODUCTS

  联系我们

双荣在线
双荣在线
CONTACT US

电话:0577-62816098

传真:0577-62816098

E-mail:1620486953@qq.com

新闻分类

/NEWS

新闻中心

当前位置:首页 >> 新闻中心 >> 详解二次接线端子铜质螺丝材质之普通黄铜

Mysql树型结构,MySQL中达成递归查询

来源:缅甸新锦江 2019-08-07 14:06

对此数据库中的树形结构数据,如部门表,有时候,大家要求精晓某单位的具备下属部分大概某有个别的享有上级部门,那时候就要求动用mysql的递归查询

CTE 也叫公用表表达式和派生表特别类似 先定义3个USACusts的CTE  

大家日常须求在关系型数据库中保存一些树状结构数据,举例分类、菜单、论坛帖子树状回复等。常用的秘籍有二种:

1、创建表

DROP TABLE IF EXISTS `t_areainfo`;
CREATE TABLE `t_areainfo` (
 `id` int(11) NOT '0' AUTO_INCREMENT,
 `level` int(11) DEFAULT '0',
 `name` varchar(255) DEFAULT '0',
 `parentId` int(11) DEFAULT '0',
 `status` int(11) DEFAULT '0',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;
WITH USACusts AS
(
  SELECT custid, companyname
  FROM Sales.Customers
  WHERE country = N'USA'
)
SELECT * FROM USACusts;
  1. 领接表的措施;

  2. 预排序遍历树格局;

二、初阶数据

INSERT INTO `t_areainfo` VALUES ('1', '0', '中国', '0', '0');
INSERT INTO `t_areainfo` VALUES ('2', '0', '华北区', '1', '0');
INSERT INTO `t_areainfo` VALUES ('3', '0', '华南区', '1', '0');
INSERT INTO `t_areainfo` VALUES ('4', '0', '北京', '2', '0');
INSERT INTO `t_areainfo` VALUES ('5', '0', '海淀区', '4', '0');
INSERT INTO `t_areainfo` VALUES ('6', '0', '丰台区', '4', '0');
INSERT INTO `t_areainfo` VALUES ('7', '0', '朝阳区', '4', '0');
INSERT INTO `t_areainfo` VALUES ('8', '0', '北京XX区1', '4', '0');
INSERT INTO `t_areainfo` VALUES ('9', '0', '北京XX区2', '4', '0');
INSERT INTO `t_areainfo` VALUES ('10', '0', '北京XX区3', '4', '0');
INSERT INTO `t_areainfo` VALUES ('11', '0', '北京XX区4', '4', '0');
INSERT INTO `t_areainfo` VALUES ('12', '0', '北京XX区5', '4', '0');
INSERT INTO `t_areainfo` VALUES ('13', '0', '北京XX区6', '4', '0');
INSERT INTO `t_areainfo` VALUES ('14', '0', '北京XX区7', '4', '0');
INSERT INTO `t_areainfo` VALUES ('15', '0', '北京XX区8', '4', '0');
INSERT INTO `t_areainfo` VALUES ('16', '0', '北京XX区9', '4', '0');
INSERT INTO `t_areainfo` VALUES ('17', '0', '北京XX区10', '4', '0');
INSERT INTO `t_areainfo` VALUES ('18', '0', '北京XX区11', '4', '0');
INSERT INTO `t_areainfo` VALUES ('19', '0', '北京XX区12', '4', '0');
INSERT INTO `t_areainfo` VALUES ('20', '0', '北京XX区13', '4', '0');
INSERT INTO `t_areainfo` VALUES ('21', '0', '北京XX区14', '4', '0');
INSERT INTO `t_areainfo` VALUES ('22', '0', '北京XX区15', '4', '0');
INSERT INTO `t_areainfo` VALUES ('23', '0', '北京XX区16', '4', '0');
INSERT INTO `t_areainfo` VALUES ('24', '0', '北京XX区17', '4', '0');
INSERT INTO `t_areainfo` VALUES ('25', '0', '北京XX区18', '4', '0');
INSERT INTO `t_areainfo` VALUES ('26', '0', '北京XX区19', '4', '0');
INSERT INTO `t_areainfo` VALUES ('27', '0', '北京XX区1', '4', '0');
INSERT INTO `t_areainfo` VALUES ('28', '0', '北京XX区2', '4', '0');
INSERT INTO `t_areainfo` VALUES ('29', '0', '北京XX区3', '4', '0');
INSERT INTO `t_areainfo` VALUES ('30', '0', '北京XX区4', '4', '0');
INSERT INTO `t_areainfo` VALUES ('31', '0', '北京XX区5', '4', '0');
INSERT INTO `t_areainfo` VALUES ('32', '0', '北京XX区6', '4', '0');
INSERT INTO `t_areainfo` VALUES ('33', '0', '北京XX区7', '4', '0');
INSERT INTO `t_areainfo` VALUES ('34', '0', '北京XX区8', '4', '0');
INSERT INTO `t_areainfo` VALUES ('35', '0', '北京XX区9', '4', '0');
INSERT INTO `t_areainfo` VALUES ('36', '0', '北京XX区10', '4', '0');
INSERT INTO `t_areainfo` VALUES ('37', '0', '北京XX区11', '4', '0');
INSERT INTO `t_areainfo` VALUES ('38', '0', '北京XX区12', '4', '0');
INSERT INTO `t_areainfo` VALUES ('39', '0', '北京XX区13', '4', '0');
INSERT INTO `t_areainfo` VALUES ('40', '0', '北京XX区14', '4', '0');
INSERT INTO `t_areainfo` VALUES ('41', '0', '北京XX区15', '4', '0');
INSERT INTO `t_areainfo` VALUES ('42', '0', '北京XX区16', '4', '0');
INSERT INTO `t_areainfo` VALUES ('43', '0', '北京XX区17', '4', '0');
INSERT INTO `t_areainfo` VALUES ('44', '0', '北京XX区18', '4', '0');
INSERT INTO `t_areainfo` VALUES ('45', '0', '北京XX区19', '4', '0');
INSERT INTO `t_areainfo` VALUES ('46', '0', 'xx省1', '1', '0');
INSERT INTO `t_areainfo` VALUES ('47', '0', 'xx省2', '1', '0');
INSERT INTO `t_areainfo` VALUES ('48', '0', 'xx省3', '1', '0');
INSERT INTO `t_areainfo` VALUES ('49', '0', 'xx省4', '1', '0');
INSERT INTO `t_areainfo` VALUES ('50', '0', 'xx省5', '1', '0');
INSERT INTO `t_areainfo` VALUES ('51', '0', 'xx省6', '1', '0');
INSERT INTO `t_areainfo` VALUES ('52', '0', 'xx省7', '1', '0');
INSERT INTO `t_areainfo` VALUES ('53', '0', 'xx省8', '1', '0');
INSERT INTO `t_areainfo` VALUES ('54', '0', 'xx省9', '1', '0');
INSERT INTO `t_areainfo` VALUES ('55', '0', 'xx省10', '1', '0');
INSERT INTO `t_areainfo` VALUES ('56', '0', 'xx省11', '1', '0');
INSERT INTO `t_areainfo` VALUES ('57', '0', 'xx省12', '1', '0');
INSERT INTO `t_areainfo` VALUES ('58', '0', 'xx省13', '1', '0');
INSERT INTO `t_areainfo` VALUES ('59', '0', 'xx省14', '1', '0');
INSERT INTO `t_areainfo` VALUES ('60', '0', 'xx省15', '1', '0');
INSERT INTO `t_areainfo` VALUES ('61', '0', 'xx省16', '1', '0');
INSERT INTO `t_areainfo` VALUES ('62', '0', 'xx省17', '1', '0');
INSERT INTO `t_areainfo` VALUES ('63', '0', 'xx省18', '1', '0');
INSERT INTO `t_areainfo` VALUES ('64', '0', 'xx省19', '1', '0');

缅甸新锦江赌场,with  ()  称为内部查询   与派生表同样,一旦外部查询落成后,CTE就自动释放了

假诺树状结构如下图:

3、向下递归

利用find_in_set()函数和group_concat()函数达成递归查询:

DROP FUNCTION IF EXISTS queryChildrenAreaInfo;
DELIMITER ;;
CREATE FUNCTION queryChildrenAreaInfo(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(areaId AS CHAR);

WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
;;
DELIMITER ;

CTE内部格局 便是位置代码所表示的点子  其实还有一种外部形式

缅甸新锦江赌场 1

四、调用格局

SELECT queryChildrenAreaInfo(1);

缅甸新锦江赌场 2

查询id为"四"上边包车型大巴具备节点

SELECT * FROM t_areainfo WHERE FIND_IN_SET(id,queryChildrenAreaInfo(4));

缅甸新锦江赌场 3

WITH C(orderyear, custid) AS
(
  SELECT YEAR(orderdate), custid
  FROM Sales.Orders
)
SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
FROM C
GROUP BY orderyear;
GO

C(orderyear, custid)  可以理解为 select orderyear, custid from C   指定返回你想要的列  不过个人感觉没什么用!

它和派生表相同 也可以在CTE中查询使用参数

DECLARE @empid AS INT = 3;

WITH C AS
(
  SELECT YEAR(orderdate) AS orderyear, custid
  FROM Sales.Orders
  WHERE empid = @empid
)
SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
FROM C
GROUP BY orderyear;
GO

领接表格局

伍、向上递归

DROP FUNCTION IF EXISTS queryChildrenAreaInfo1;
DELIMITER;;
CREATE FUNCTION queryChildrenAreaInfo1(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp='$';
SET sTempChd = CAST(areaId AS CHAR);
SET sTemp = CONCAT(sTemp,',',sTempChd);

SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd;
WHILE sTempChd <> 0 DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd;
END WHILE;
RETURN sTemp;
END
;;
DELIMITER ;

概念多少个CTE

重在借助于叁个 parent 字段,用于指向上级节点,将周边的上下级节点连接起来,id 为全自动递增自动,parent_id 为上级节点的 id。有目共睹,“Java”是“Language”的子节点。

陆、调用格局

查询id为"7"的节点的有着上级节点:

SELECT * from t_areainfo where FIND_IN_SET(id,queryChildrenAreaInfo1(7));

缅甸新锦江赌场 4

 

WITH C1 AS
(
  SELECT YEAR(orderdate) AS orderyear, custid
  FROM Sales.Orders
),
C2 AS
(
  SELECT orderyear, COUNT(DISTINCT custid) AS numcusts
  FROM C1
  GROUP BY orderyear
)
SELECT orderyear, numcusts
FROM C2
WHERE numcusts > 70;

咱俩要彰显树,PHP 代码也能够很直观,代码如下:

八个CTE用 , 隔断 通过with 内部存款和储蓄器 能够在外查询中往往引用

复制代码 代码如下:

WITH YearlyCount AS
(
  SELECT YEAR(orderdate) AS orderyear,
    COUNT(DISTINCT custid) AS numcusts
  FROM Sales.Orders
  GROUP BY YEAR(orderdate)
)
SELECT Cur.orderyear, 
  Cur.numcusts AS curnumcusts, Prv.numcusts AS prvnumcusts,
  Cur.numcusts - Prv.numcusts AS growth
FROM YearlyCount AS Cur
  LEFT OUTER JOIN YearlyCount AS Prv
    ON Cur.orderyear = Prv.orderyear + 1;

<?php
/**
 * 获取父节点下的全体子节点
 *
 * @since 2011-05-18
 *
 * @param $parent_id 父节点 id,0 则显得整个树结构。
 * @param $level 当前节点所处的层级,用于缩进展现节点。
 * @return void
 */
function show_children ($parent_id = 0, $level = 0)
Mysql树型结构,MySQL中达成递归查询。{
    // 获取父节点下的全数子节点
    $result = mysql_query('SELECT id, name FROM tree WHERE parent_id=' . intval($parent_id));
    // 展现每一种子节点
    while ($row = mysql_fetch_array($result)) {
        // 缩进显示
        echo '<div style="margin-left:' . ($level * 12) . 'px">' . $row['name'] . '</div>';
        // 递归调用当前函数,展现再下超级的子节点
        show_children($row['id'], $level + 1);
    }
}
?>

能够供给在三个同样表结果做物理实例化  那样能够省去点不清查询时间 只怕在不时表和表变量中固化内部查询结果

想要展现全体树结构,调用 show_children()。想要显示“Database”子树,则调用 show_children(2),因为“Database”的 id 是 2。

递归CTE

再有三个经常使用的职能是获得节点路线,即给出三个节点,重返从根节点到眼下节点的门路。用函数实现如下:

递归CTE至少由四个查询定义,至少1个查询作为定位点成员,2个询问作为递归成员。

复制代码 代码如下:

递归成员是一个引用CTE名称的查询 ,在率先次调用递归成员,上二个结出集是由上一回递归成员调用重临的。 其实就和C# 方法写递归一样  重返上两个结果集 依次输出

<?php
/**
 * @param $id 须求猎取路线的当下节点的 id。
 * @return array
 */
function get_path($id)
{
    // 获取当前节点的父节点 id 和日前节点名
    $result = mysql_query('SELECT parent_id, name FROM tree WHERE id='.intval($id));
    $row = mysql_fetch_array($result);
    // 使用此数组保存路线
    $path = array();
    // 将方今节点名保存进路线数组中
    $path[] = $row['name'];
    // 假若父节点非 0,即非根节点,则开始展览递归调用获取父节点的门道
    if ($row['parent_id']) {
        // 递归调用,获取父节点的不2秘诀,并且统壹到当下路径数组的其余成分前边
        $path = array_merge(get_path($row['parent_id']), $path);
    }
    return $path;
}
?>

   WITH    Emp
 AS ( SELECT  * FROM  dbo.dt_users
               WHERE  id=2
                UNION ALL  
                SELECT d.* FROM  Emp
                         INNER JOIN dbo.dt_users d ON d.agent_id = Emp.id
             )
    SELECT *
     FROM Emp 

想要获取“MySQL 5.0”的渠道,调用 get_path(4),肆 便是那一个节点的 id。

在前面也写过 sql 语句的推行顺序 其实到  FROM Emp   时 就打开了节点第三遍递归  当我们递归到第壹回的时候 这一个为试行的sql 语句实在是怎么的呢

领接表格局的独到之处在于轻巧领会,代码也相比较轻便明了。缺点则是递归中的 SQL 查询会招致负载变大,特别是内需管理相当大型的树状结构的时候,查询语句会趁着层级的充实而充实,WEB 应用的瓶颈基本都在数据库方面,所以那是三个相比较致命的缺陷,直接促成树结构的扩充困难重重。

首页 | 关于我们 | 产品中心  | 新闻中心 | 资质认证  | 下载中心 | 在线留言  | 联系我们
Copyright © 2014 缅甸新锦江赌场-官方网站缅甸新锦江 Rights Reserved.  技术支持:温州中网   备案号:浙ICP备14009337号-1  

Baidu
sogou