Mysql如何获取给定ID的父母和所有孩子? [复制]

Posted

技术标签:

【中文标题】Mysql如何获取给定ID的父母和所有孩子? [复制]【英文标题】:Mysql how to get parent and all child for given ID? [duplicate] 【发布时间】:2019-12-10 03:11:38 【问题描述】:

我有两个表(类别,产品)如下:

分类表:

cid name parent
1  items Null
2    A    1
3    aa   2
4    ab   2
5    ac   2
6    B    1
7    ba   5
8    bb   5
9    bc   5
10   C    1
11   ca   9
12   cb   9
13   cc   9

产品表:

pid  cid  pname
1     2   p1
2     3   p2
3     4   p3
4     4   p4
5     5   p5
6     5   p6

在这里,我想获取特定父级的所有父级和子级产品。这里我有cid = 2,然后我需要cid=2 及其子的所有产品。

在这里我尝试了类似的方法,但不确定如何使用此查询加入 product 表:

select  cid,
        name,
        parent
from    (select * from categories
         order by parent, cid) categories,
        (select @pv := '2') initialisation
where   find_in_set(parent, @pv) > 0
and     @pv := concat(@pv, ',', cid)

更新: 数据库模型

谁能帮帮我? 谢谢你。

【问题讨论】:

发布预期的 o/p? 我不知道为什么这有否决票。 @HimanshuAhuja,我想从产品表中获取特定父类别 ID 的所有父子产品。例如:假设我有cid=2,那么我需要产品表中的p1,p2,p3,p4,p5,p6 从表格定义什么是父母或孩子以及两个表格之间的哪些字段相关,这并不是很明显。例如cid 是类别 ID 还是子 ID?包含所有输出的示例并不能说明太多。 @danblack 是cid 【参考方案1】:

首先应该注意的是,您的查询不会给您根类别,只有它的子类别。因此,您需要向其中添加UNION 以包含根类别。其次,递归部分不需要子查询,可以直接在查询中进行排序。然后,您可以将该查询用作派生表并将JOIN 用于products 表:

SELECT *
FROM (
      SELECT 2 AS cid
      UNION ALL
      (SELECT  cid
       FROM categories
       CROSS JOIN (SELECT @pv := '2') initialisation
       WHERE   find_in_set(parent, @pv) > 0
         AND   @pv := concat(@pv, ',', cid)
       ORDER BY parent, cid)
      ) c
JOIN products p ON p.cid = c.cid

输出(用于您的样本数据)

cid     pid     cid     pname
2       1       2       p1
3       2       3       p2
4       3       4       p3
4       4       4       p4
5       5       5       p5
5       6       5       p6

您可能只需要产品名称列表,在这种情况下,您可以将外部查询中的 * 替换为例如GROUP_CONCAT(p.pname) AS products 并得到结果:

products
p1,p2,p3,p4,p5,p6

Demo on dbfiddle

要获取类别名称,您必须在内部查询中SELECT

SELECT *
FROM (
      SELECT cid, name
      FROM categories
      WHERE cid = 2
      UNION ALL
      (SELECT  cid, name
       FROM categories
       CROSS JOIN (SELECT @pv := '2') initialisation
       WHERE   find_in_set(parent, @pv) > 0
         AND   @pv := concat(@pv, ',', cid)
       ORDER BY parent, cid)
      ) c
JOIN products p ON p.cid = c.cid

输出:

cid     name    pid     cid     pname
2       A       1       2       p1
3       aa      2       3       p2
4       ab      3       4       p3
4       ab      4       4       p4
5       ac      5       5       p5
5       ac      6       5       p6

Demo on dbfiddle

【讨论】:

伟大的伙伴你理解上述查询和数据的 OP 是什么意思。我想知道我是否能抓住同样的东西。 @Nick 这实际上是我需要的。非常感谢。一个问题我如何获得类别名称以及此选择? 我尝试将外部查询更改为 SELECT p.pid ,p.pname ,c.name 但它不起作用 @user3733831 请查看我的编辑。我添加了一个查询,该查询也将获取类别名称 太棒了。还有一个问题......我们可以在外部查询中获取特定列而不是*吗?【参考方案2】:
select product.pname, product.cid, category.parent
  from product 
 inner join category
    on product.cid = catgeory.cid; 

【讨论】:

这不是我需要的 别担心@mamta-soni,我也无法解决这个问题。还是不行。 @danblack 我用数据库模型更新了问题。请检查一下

以上是关于Mysql如何获取给定ID的父母和所有孩子? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

检索给定记录的所有孩子和父母

如果所有孩子都符合条件,则选择父母

获取父母的所有可能的孩子/后代

使用谓词在 Core Data 中获取父母的所有孩子

如何使用 JPA/Hibernate 在孩子的 id 中引用父母的 id?

如何使用 PDO 从 PHP 中的单个 select 语句将孩子分配给父母?