V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
thisisgpy
V2EX  ›  问与答

求教一个查询上下级关系的 SQL

  •  
  •   thisisgpy · 2019-04-28 10:37:37 +08:00 · 2516 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    组织编号使用层级方式,比如总公司是 0001,分公司是 00010100,分公司部门是 000101000010。

    每一级都使用直接上级的编号并加上本级编号。

    现在给定任意一个部门编号,查询出他本身及其所有上级,请问 SQL 该怎么编写呢?

    数据库是 MySQL。

    先谢过各位大佬解惑。

    9 条回复    2019-04-28 18:27:38 +08:00
    linauror
        1
    linauror  
       2019-04-28 11:07:31 +08:00
    既然编号这么有规律,程序先直接按长度取编号,可以确定出上级编号及上上级编号...,再去查呢
    thisisgpy
        2
    thisisgpy  
    OP
       2019-04-28 11:11:14 +08:00
    @linauror 我现在就是在程序里面分析出所有编号去查,但是我想尝试直接在 SQL 层面解决。
    imicksoft
        3
    imicksoft  
       2019-04-28 11:15:16 +08:00
    liprais
        4
    liprais  
       2019-04-28 11:15:52 +08:00
    mysql 做不到
    需要使用 recursive cte
    chenset
        5
    chenset  
       2019-04-28 11:18:19 +08:00
    层数确定不是直接 join/left join 就可以了吗?

    表结构是: 父节点 ID(parent_id), 节点 ID(id)

    select * from company c1 join company c2 on c1.id = c2.parent_id where c2.id = XXX;

    表结构不同,就不晓得了. 或者改表结构.
    youyaang
        6
    youyaang  
       2019-04-28 11:20:21 +08:00
    SELECT MID(id, LENGTH(id)-4, LENGTH(id)) AS LastLvId FROM DB_xx;

    没测试过,不知道能不能用=。=
    xinyewdz
        7
    xinyewdz  
       2019-04-28 12:23:33 +08:00
    慎用 join 操作
    littlewing
        8
    littlewing  
       2019-04-28 13:16:47 +08:00
    不管怎样都是全表扫描
    所以为什么不把层级关系存起来呢
    xxxy
        9
    xxxy  
       2019-04-28 18:27:38 +08:00
    我有一个简单的方法。用程序串行去查询。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4092 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:28 · PVG 13:28 · LAX 21:28 · JFK 00:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.