父子id mysql,MYSQL 递归父子

cd69f8c7d0b9

捕获.PNG

子查父 (根据子节点查询所有父节点)

SELECT

T2.*

FROM

(

SELECT

@r AS _id,

(

SELECT

@r := parent_id

FROM

t_sys_organization

WHERE

id = _id

) AS parent_id,

@l := @l + 1 AS lvl

FROM

(SELECT @r := '4', @l := 0) vars,

t_sys_organization h

WHERE

@r <> 0

) T1

JOIN t_sys_organization T2 ON T1._id = T2.id

ORDER BY

T1.lvl DESC

父查子 (根据节点查询所有字点)

SELECT

ID.level,

DATA.*

FROM

(SELECT

@ids AS _ids,

(SELECT

@ids := GROUP_CONCAT(id)

FROM

t_sys_organization

WHERE FIND_IN_SET(parent_id, @ids)) AS cids,

@l := @l + 1 AS LEVEL

FROM

t_sys_organization,

(SELECT

@ids := '1',

@l := 0) b

WHERE @ids IS NOT NULL) id,

t_sys_organization DATA

WHERE FIND_IN_SET(DATA.id, ID._ids)

ORDER BY LEVEL,

id ;

查询结果

cd69f8c7d0b9

捕获.PNG

父查子(方法二)

SELECT

O2.*

FROM

(SELECT

@r AS _id,

(SELECT

@r := id

FROM

t_sys_organization

WHERE parent_id = _id) AS id,

@l := @l + 1 AS lvl

FROM

(SELECT

@r := '1',

@l := 0) vars,

t_sys_organization h) O1

JOIN t_sys_organization O2

ON O1._id = O2.parent_id

WHERE O2.enabled = 1

ORDER BY O1.lvl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gorm是一个非常流行的golang ORM库,它可以轻松地操作数据库。在gorm中,可以使用Preload方法来实现单表父子递归查询。下面是一个示例代码: ```go type Category struct { ID uint Name string ParentID uint Children []Category } func (c *Category) GetAllChildren(db *gorm.DB) error { return db.Where("parent_id = ?", c.ID).Find(&c.Children).Error } func (c *Category) GetAllDescendants(db *gorm.DB) ([]Category, error) { var descendants []Category err := db.Where("parent_id = ?", c.ID).Find(&descendants).Error if err != nil { return nil, err } for i := range descendants { children, err := descendants[i].GetAllDescendants(db) if err != nil { return nil, err } descendants[i].Children = children } return descendants, nil } func main() { db, err := gorm.Open(mysql.Open("user:password@tcp(127.0.0.1:3306)/database"), &gorm.Config{}) if err != nil { panic("failed to connect database") } var rootCategory Category err = db.First(&rootCategory, "parent_id = ?", 0).Error if err != nil { panic("failed to get root category") } err = rootCategory.GetAllChildren(db) if err != nil { panic("failed to get all children") } fmt.Printf("%+v\n", rootCategory) descendants, err := rootCategory.GetAllDescendants(db) if err != nil { panic("failed to get all descendants") } fmt.Printf("%+v\n", descendants) } ``` 在上面的代码中,我们定义了一个Category结构体,它包含了ID、Name、ParentID和Children四个字段。GetAllChildren方法用于获取当前分类的所有分类,GetAllDescendants方法用于获取当前分类的所有后代分类。在GetAllDescendants方法中,我们使用递归的方式获取所有后代分类,并将它们存储在Children字段中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值