【问题标题】:Loop join or recursive in sql to get the max level?在sql中循环连接或递归以获得最大级别?
【发布时间】:2020-05-28 19:36:43
【问题描述】:

我有一个数据库表名“类别”,并具有以下属性:

  • 身份证
  • parent_id
  • 代码
  • 姓名

样本数据:

[1][null][0][category 1]
[2][null][1][category 2]
[3][null][2][category 3]
[4][null][3][category 4]
[5][3][4][category 5]
[6][null][5][category 6]
[7][5][0][category 7]
[8][null][1][category 8]
[9][7][2][category 9]
[10][null][3][category 10]
[11][null][4][category 11]
[12][null][5][category 12]

类别表就像一棵树或节点。它可以有不同的层次。

对于示例数据,类别 9 是类别 7 的子类别。类别 7 是类别 5 的子类别。类别 5 是类别 3 的子类别。

所以你可以把这个类别想象成树或节点。

类别 3 > 类别 5 > 类别 7 > 类别 9

所以第 9 类是第 4 级。

所以我的问题是,如何获得最高级别,以便预期结果为 4。

【问题讨论】:

  • 到目前为止你有没有尝试过?如果它是一个小表,最好将它全部读入内存并从那里计算出来,而不是多次 SQL 调用。
  • 其实这只是我任务的一部分。我只需要获得递归的最大级别,然后我将循环类别表取决于级别。所以如果我得到 4 的结果,那么我将循环 4 次这个类别表来获取父类别 id
  • 如果您需要再次读取数据,那么我会认为将数据放在内存中会更好。为什么要继续返回数据库和更多 SQL 语句的开销?
  • 然后例如我有一个 100 类别,其中一些可能有不同的级别。所以你的意思是我会在后端循环它然后避免这个到sql?
  • 递归 CTE 最适合这类问题

标签: php sql sql-server laravel


【解决方案1】:

如果你想计算类别 3

create table #temp
(
id int,
parent_id int,
code int,
name varchar(20)
)

insert into #temp values(1,null,0,'category 1')
insert into #temp values(2,null,1,'category 2')
insert into #temp values(3,null,2,'category 3')
insert into #temp values(4,null,3,'category 4')
insert into #temp values(5,3,4,'category 5')
insert into #temp values(6,null,5,'category 6')
insert into #temp values(7,5,0,'category 7')
insert into #temp values(8,null,1,'category 8')
insert into #temp values(9,7,2,'category 9')
insert into #temp values(10,null,3,'category 10')
insert into #temp values(11,null,4,'category 11')
insert into #temp values(12,null,5,'category 12')



;WITH items AS (
    SELECT id,name,parent_id
    FROM #temp 
    WHERE parent_id is null and id=3
    UNION ALL

    SELECT i.id,i.name,i.parent_id
    FROM #temp i
    INNER JOIN items itms ON itms.id = i.parent_id
)
SELECT count(*) FROM items 

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多