我有一个以下结构的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)
如何在没有程序和查询的情况下实现这一目标?
答案 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_Id
和GROUP 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_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
答案 2 :(得分:0)