mysql 数据分层_MySQL中的分层数据

您想要获得父ID:

所以假设你被给予

set @parentId = 1 /*toys*/

select

*

from

Items i

inner join Categories c on c.id = i.categoryId

where

c.parentId = @parentId

这将给你所需的项目 – 一个主要的设计缺陷:它不处理多层次的层次类别.

假设你有这个类别表:

*Categories table*

id | name | parentId

1 | Toys | 0

2 | Dolls | 1

3 | Bikes | 1

4 | Models | 2

5 | Act.Fig.| 2

6 | Mountain| 3

7 | BMX | 3

和项目:

*items table*

item | category_id

Barbie | 4

GIJoe | 5

Schwinn| 6

Huffy | 7

获取所有相关项目的唯一方法是进行自我加入:

select

*

from

Items i

inner join Categories c on c.id = i.categoryId

inner join Categories c2 on c.parentId = c2.id

where

c2.parentId = @parentId

此模式不可扩展,因为您可以拥有多层次的层次结构.

处理层次结构的一个常见方法是构建一个“扁平化”表:将每个节点链接到所有它的后代的一行.

除了一个类别表,你建立一个第二个表:

*CategoriesFlat table* The Name column is here only for readability

id | name | parentId

1 | Toys | 1

-----------------

2 | Dolls | 1

2 | Dolls | 2

-----------------

4 | Models | 1

4 | Models | 2

4 | Models | 4

5 | Act.Fig.| 1

5 | Act.Fig.| 2

5 | Act.Fig.| 5

-----------------

3 | Bikes | 1

3 | Bikes | 3

-----------------

6 | Mountain| 1

6 | Mountain| 3

6 | Mountain| 6

7 | BMX | 1

7 | BMX | 3

7 | BMX | 7

所以你可以写:

select

*

from

Items i

inner join CategoriesFlat c on c.id = i.categoryId

where

c.parentId = @parentId

并获得所有相关的类别和项目.

这是一个great slideshow about SQL anti-patterns和他们的解决方案. (SQL中的分层数据是一种反模式,但不要沮丧 – 我们都遇到这种情况)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值