-1

我有一个以下结构的 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)

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

4

3 回答 3

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_id分组parent_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
于 2013-01-02T09:46:15.060 回答
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_Idand GROUP BY 1

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

SELECT GROUP_CONCAT(element_id)
  FROM Elements 
 WHERE Parent_Id IN (SELECT Element_Id
                        FROM Elements
                       WHERE Parent_Id = 1)
于 2013-01-02T09:41:08.510 回答
0

看看我的这个问题

使用单个查询(递归查询)在 mysql 表中查找所有父级

这是此类工作的来源。

http://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/

于 2013-01-02T09:39:42.377 回答