3

次のデータを含むemployeeテーブルがあります。特定のマネージャーについて、マネージャーの階層に従って、すべての従業員のリストを取得したいと考えています。

id  name    manager

1   John    6
2   Gill    7
3   Ben     2
4   Roy     8
5   Lenin   6
6   Nancy   7
7   Sam     0
8   Dolly   3

たとえば、マネージャーSam (7) の下にある従業員を取得する必要があります。ご覧のとおり、Samにはマネージャーがいませんが、従業員GillNancyのマネージャーであり、従業員BenJohn、Leninのマネージャーです。

だから私はこのようなクエリを実行しました:

select * from employee where manager=7;

GillNancyの 2 つの行として結果が得られます。

しかし今、従業員のBenJohnLeninも出力に表示したいと思います。どちらもSamの下にあるマネージャーGillNancyの下にあるためです。

マネージャーの従業員を階層的に表示するようにクエリを構成するにはどうすればよいですか? つまり、マネージャーSamの下にあるすべてのGillNancyBenJohn、およびLeninを表示するにはどうすればよいでしょうか?

4

2 に答える 2

2

WHERE句にINサブクエリを追加すると、それが処理されます。例えば:

SELECT * FROM employee WHERE manager = 7 OR manager IN (SELECT id FROM employee WHERE manager = 7)
于 2012-06-15T13:26:38.100 に答える
2

より良い視覚化のために、次のクエリも使用できます。

select e1.name, e2.name, e3.name 
from employee e1 
left join employee e2 on e1.id = e2.manager
left join employee e3 on e2.id = e3.manager
where e2.manager = 7

left join一方、階層ごとに別のものを追加する必要があります。これは一方ではマイナス面であり、他方ではショーンの答えよりも扱いやすいです。

プロ側では、次のような出力が得られます。

name        name1       name2
---------------------------------
Sam         Gill        Ben     
Sam         Nancy       John    
Sam         Nancy       Lenin   

これははるかに目にやさしく、PHPなどを介してさらに目に優しい形で簡単に配置できます。

于 2012-06-15T13:43:42.373 に答える