SQL:获取元素的子元素

时间:2013-01-02 09:35:37

标签: mysql sql

我有一个以下结构的MySQL表。

**Table elements :**

element_id  element_name    parent_id
1           UIG             0
2           CAM             1
3           IHG             1
4           USR             1
5           DBL             1
6           APD             1
7           RTM             1
8           OCR             2
9           IRT             3
10          ICR             3
11          OCR             2
12          USH             1
13          AML             1

我需要找到给定元素的子元素。

我做了以下查询:

SELECT parent_id,GROUP_CONCAT(element_id)
FROM elements
WHERE parent_id='1'
GROUP BY parent_id

返回,

+-----------+--------------------------+
| parent_id | GROUP_CONCAT(element_id) |
+-----------+--------------------------+
|         1 | 2,3,4,5,6,7,12,13        | 
+-----------+--------------------------+
1 row in set (0.00 sec)

虽然我还需要元素2和3的子元素,这应该导致

+-----------+------------------------------------+
| parent_id | GROUP_CONCAT(element_id)           |
+-----------+------------------------------------+
|         1 | 2,3,4,5,6,7,8,9,10,11,12,13        | 
+-----------+------------------------------------+
1 row in set (0.00 sec)

如何在没有程序和查询的情况下实现这一目标?

3 个答案:

答案 0 :(得分:1)

使用IN ()谓词...

SELECT '1' As Parent_Id,GROUP_CONCAT(element_id)
  FROM elements 
 WHERE Parent_Id IN ('1','2','3')
 GROUP BY '1';

某些数据库在此方案中需要GROUP BY,其他数据库则不需要,但即使不需要也可以包含它。

顺便说一句,我怀疑Parent_Id是某种类型的数字,在这种情况下应该真正读取...

SELECT 1 As Parent_Id,GROUP_CONCAT(element_id)
  FROM elements 
 WHERE Parent_Id IN (1,2,3)
 GROUP BY 1;

您实际上可以完全排除1 As Parent_IdGROUP BY 1

如果只能指定一个值,请使用子查询...

SELECT GROUP_CONCAT(element_id)
  FROM Elements 
 WHERE Parent_Id IN (SELECT Element_Id
                        FROM Elements
                       WHERE Parent_Id = 1)

答案 1 :(得分:1)

您只需要在子查询上使用in运算符。

select group_concat(element_id)
from chpr
where parent_id in (
  select group_concat(element_id)
from chpr
where parent_id = 1
group by parent_id)
;

**根据OP的评论,这些级别肯定是一个问题**

但是,根据初始样本数据和请求,这里是SQLFIDDLE DEMO,它根据问题的预期输出提供结果。

唯一的变化是,需要将element_idparent_id分组为最早的第一个子查询。

根本不是一个非常优雅的查询:

select 1 as parent_id, group_concat(x.element_id)
from (
(select element_id
from chpr
where parent_id in
(select element_id
from chpr
where parent_id = 1
group by element_id, parent_id
))
union all
(select element_id
from chpr
where parent_id = 1
group by element_id, parent_id
)) x
;

结果:

PARENT_ID   GROUP_CONCAT(X.ELEMENT_ID)
1           8,9,10,11,2,3,4,5,6,7,12,13

答案 2 :(得分:0)