thisisgpy
V2EX  ›  问与答

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

  •  
  •   thisisgpy · Apr 28, 2019 · 3243 views
    This topic created in 2585 days ago, the information mentioned may be changed or developed.

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

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

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

    数据库是 MySQL。

    先谢过各位大佬解惑。

    9 replies    2019-04-28 18:27:38 +08:00
    linauror
        1
    linauror  
       Apr 28, 2019
    既然编号这么有规律,程序先直接按长度取编号,可以确定出上级编号及上上级编号...,再去查呢
    thisisgpy
        2
    thisisgpy  
    OP
       Apr 28, 2019
    @linauror 我现在就是在程序里面分析出所有编号去查,但是我想尝试直接在 SQL 层面解决。
    F281M6Dh8DXpD1g2
        4
    F281M6Dh8DXpD1g2  
       Apr 28, 2019
    mysql 做不到
    需要使用 recursive cte
    chenset
        5
    chenset  
       Apr 28, 2019
    层数确定不是直接 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  
       Apr 28, 2019
    SELECT MID(id, LENGTH(id)-4, LENGTH(id)) AS LastLvId FROM DB_xx;

    没测试过,不知道能不能用=。=
    xinyewdz
        7
    xinyewdz  
       Apr 28, 2019
    慎用 join 操作
    littlewing
        8
    littlewing  
       Apr 28, 2019
    不管怎样都是全表扫描
    所以为什么不把层级关系存起来呢
    xxxy
        9
    xxxy  
       Apr 28, 2019
    我有一个简单的方法。用程序串行去查询。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1017 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 19:06 · PVG 03:06 · LAX 12:06 · JFK 15:06
    ♥ Do have faith in what you're doing.