数据库
首页 > 数据库> > mysql-通过第n个孩子ID获得最高父级?

mysql-通过第n个孩子ID获得最高父级?

作者:互联网

现在有一个问题,我们通常使用这种技术来维护父子关系,即我们将所有实体存储在一个带有parent_id列的表中,并且所有最主要的父级在parent_id列中都为0,这是我同意的一种很好且标准化的技术还有一个缺点,它速度慢且效率低下.这主要是由递归引起的,例如对于每个父对象,我们必须一次又一次地运行查询以生成一棵树

SELECT id FROM `table` WHERE parent_id=something

我已经看过一些解决方案,有人可能尝试通过一次又一次地运行查询来使用任何编程语言来做到这一点,这在服务器上造成了负担;有人提供了存储过程,但还涉及到递归.

所以我的问题是我们可以用一个数据库查询树(联接或子查询)吗?

>如果我们知道深度还是不知道深度?
>如果可能的话,我们如何获得任何孩子的最高父母(即parent_id = 0)?
>如果不可能,那么为什么这种技术如此出名,而又有缺陷,或者我们对此有另一种解决方案?

我已经添加了SQL小提琴,但它只有模式

FIDDLE

解决方法:

我不知道MYSQL是否可行,我的职业生涯主要是在SQL Server上工作.在SQL Server中,使用WITH语句可以只执行一次查询.

这演示了如何在所有级别上获取对象的所有子代(id = 3)

With pa as (
     select pa1.*
     From prarent as pa1
     Where id = 3
     union all
     select pa2.*
     from pa join prarent as pa2 on pa.id = pa2.parent_id
  )
select * from pa where pa.id != 3

DEMO

另一个示例使对象(id = 7)的所有父对象最多

With pa as (
     select pa1.*
     From prarent as pa1
     Where id = 7
     union all
     select pa2.*
     from pa join prarent as pa2 on pa.parent_id = pa2.id
  )
select * from pa where pa.id != 7

DEMO

另一个仅获取最高父级的示例

With pa as (
     select pa1.*
     From prarent as pa1
     Where id = 7
     union all
     select pa2.*
     from pa join prarent as pa2 on pa.parent_id = pa2.id
  )
select top 1 * 
from pa 
where pa.id != 7
order by id asc

在此示例中,我假设id是递增的,并且我使用一种简单的方式(仅出于演示目的)使用order by获得最高的使用率.您可以根据数据库设计使用其他技术.

DEMO

使用这种类似的技术,您可以做更多的事情,例如让最底层的孩子…….

标签:database-design,greatest-n-per-group,hierarchical-data,sql,mysql
来源: https://codeday.me/bug/20191030/1969567.html