zoukankan      html  css  js  c++  java
  • Mysql笔记(二):递归分类层次查询

    1.问题描述:

    数据表结构同Mysql笔记(一),需求改为查找给定分类编码查找分类及其所有子类,包含子类的子类。

    2.问题分析:

    还是利用分类编码具有层次嵌套的特点,这一次需要按照org_code升序排列,目的是保障一个分类的子类一定出现在其后面。然后可以利用笔记(一)中相同的逻辑遍历每一个分类,关键点是需要不断扩充被查找的父类集合,然后利用find_in_set函数进行过滤。

    (1)按org_code升序排列:

    mysql> select org_code,parent_code from class order by org_code asc;
    +------------------+--------------+
    | org_code         | parent_code  |
    +------------------+--------------+
    | 0001             | NULL         |
    | 00010001         | 0001         |
    | 000100010001     | 00010001     |
    | 000100010002     | 00010001     |
    | 0001000100020001 | 000100010002 |
    | 00010002         | 0001         |
    | 00010003         | 0001         |
    +------------------+--------------+
    7 rows in set (0.00 sec)

    (2)遍历排序后的数据,将待查寻父类的子类逐步添加到待查寻父类列表@p中:

    mysql> select (case when org_code=@r or find_in_set(parent_code,@p) then org_code else null end) as child,(case when find_in_set(parent_code,@p) then @p:=concat(@p,',',org_code) else null end) as parents from (select org_code,parent_code from class order by org_code asc) as c,(select @r:='00010001',@p:='00010001') as t;
    +------------------+-----------------------------------------------------+
    | child            | parents                                             |
    +------------------+-----------------------------------------------------+
    | NULL             | NULL                                                |
    | 00010001         | NULL                                                |
    | 000100010001     | 00010001,000100010001                               |
    | 000100010002     | 00010001,000100010001,000100010002                  |
    | 0001000100020001 | 00010001,000100010001,000100010002,0001000100020001 |
    | NULL             | NULL                                                |
    | NULL             | NULL                                                |
    +------------------+-----------------------------------------------------+
    7 rows in set (0.00 sec)

    (3)过滤查询结果,得到分类编号为00010001的分类及其子类的子类:

    mysql> select child from (select (case when org_code=@r or find_in_set(parent_code,@p) then org_code else null end) as child,(case when find_in_set(parent_code,@p) then @p:=concat(@p,',',org_code) else null end) as parents from (select org_code,parent_code from class order by org_code asc) as c,(select @r:='00010001',@p:='00010001') as t) as m where child is not null;
    +------------------+
    | child            |
    +------------------+
    | 00010001         |
    | 000100010001     |
    | 000100010002     |
    | 0001000100020001 |
    +------------------+
    4 rows in set (0.00 sec)
  • 相关阅读:
    Linux下fork机制详解(以PHP为例)
    查看Nginx、PHP、Apache和MySQL的编译参数
    MySQL更新
    Map集合的四种遍历方式
    Selenium2工作原理
    Web自动化测试框架-PO模式
    jmeter(十二)处理Cookie与Session
    java 字符串截取的几种方式
    操作JavaScript的Alert弹框
    selenium 延迟等待的三种方式
  • 原文地址:https://www.cnblogs.com/ling-diary/p/10321459.html
Copyright © 2011-2022 走看看