2016-06-07 98 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

相關問題