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的父母和所有孩子? [复制]的主要内容,如果未能解决你的问题,请参考以下文章