2016-06-07 80 views
0

我有一个表,其中每个记录包含他的父亲,这个层次可能有多达6个级别。以下查询搜索名为“DEPARTMENT ABCD”的部门的所有家长。此查询完美工作。Mysql - 如何选择所有父母的孩子列表?

SELECT D2.id, D2.name, D2.id_parent 
FROM (
    SELECT 
     @d AS _id, 
     (SELECT @d := id_parent FROM department WHERE id = _id) AS id_parent, 
     @l := @l + 1 AS level 
    FROM 
     (SELECT 
      @d := (select id from department where name = 'DEPARTMENT ABCD'), 
      @l := 0 
     ) initial_level, 
     department D 
    WHERE @d <> 0 
) D1 
JOIN department D2 ON D1._id = D2.id 
ORDER BY D1.level DESC; 

但是,如果我想在同一时间获得超过一个孩子的父母(使用类似下面的查询),我得到的错误:“错误代码:1242子查询返回多个1行”。

查询并显示错误“子查询返回多个1行”:

SELECT D2.id, D2.name, D2.id_parent 
FROM (
    SELECT 
     @d AS _id, 
     (SELECT @d := id_parent FROM department WHERE id = _id) AS id_parent, 
     @l := @l + 1 AS level 
    FROM 
     (SELECT 
      @d := (select id from department where name like 'DEPARTMENT %A%'), 
      @l := 0 
     ) initial_level, 
     department D 
    WHERE @d <> 0 
) D1 
JOIN department D2 ON D1._id = D2.id 
ORDER BY D1.level DESC; 

我怎么能这样做的同时获得超过一个孩子的父母?

我加入SQL小提琴样本:http://sqlfiddle.com/#!9/f182fb/3

+1

如果我得到了你,你要显示项目的层次结构。如果是这样,你可以考虑选择递归的方法,这里描述http://stackoverflow.com/a/20216006/6435375 –

+0

谢谢你的答案。我看到了链接,并且所描述的方法以列的形式显示了级别,并且不支持寻找不止一个孩子的父母。 – David

+0

你会为你的数据创建一个小的小提琴样本,甚至是假数据,所以我们可以测试结果吗? (http://sqlfiddle.com) –

回答

1

鉴于层次可能有多达6级,我建议加入表6倍,以获得所选择的部门的所有祖先:

select  distinct id, name, id_parent 
from  (
      select  d6.id_parent as id6, 
         d5.id_parent as id5, 
         d4.id_parent as id4, 
         d3.id_parent as id3, 
         d2.id_parent as id2, 
         d1.id_parent as id1, 
         d1.id  as id0 
      from  department d1 
      left join department d2 on d2.id = d1.id_parent 
      left join department d3 on d3.id = d2.id_parent 
      left join department d4 on d4.id = d3.id_parent 
      left join department d5 on d5.id = d4.id_parent 
      left join department d6 on d6.id = d5.id_parent 
      where  d1.name like 'DEPARTMENT A%' 
      ) as h 
inner join department d on d.id in (id0, id1, id2, id3, id4, id5, id6) 
order by 1; 

SQL fiddle

+0

完美,甚至谢谢你!它非常完美!我唯一担心的是,查询是否会因与数千条记录的连接而变慢。你认为你可以带来一个性能问题,否则它会运行良好?先谢谢你! – David

+0

我不认为性能会成为问题。实际上,我认为原始SQL中的相关子查询可能更像是性能流失('(SELECT @d:= id_parent FROM department WHERE id = _id)')。但那只是我的直觉,我可能是错的。 – trincot

+0

好的,我明白了。非常感谢你的帮助和澄清! =] – David