【问题标题】:Mysql how to get parent and all child for given ID? [duplicate]Mysql如何获取给定ID的父母和所有孩子? [复制]
【发布时间】: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

标签: mysql sql select hierarchy hierarchical-data


【解决方案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 我用数据库模型更新了问题。请检查一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 2018-01-29
  • 2013-06-04
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多