0

従業員とその直属のマネージャーを含む単一のディレクトリ テーブルがあります。報告階層をループして、全員を必要なだけ報告ラインに戻すようにしています。マネージャーのいない人 (つまり、CEO) を攻撃した場合は、停止できます。一連の PHP の if/else ステートメントをループするのではなく、1 つの MySQL クエリで実行しようとしています。

これまでの最善の努力は次のとおりです。

SELECT d1.empno AS d1, d2.empno AS d2, d3.empno AS d3, d4.empno AS d4, d5.empno AS d5, d7.empno AS d7, d8.empno AS d8
FROM `directory` AS d1
LEFT JOIN directory AS d2 ON d1.manageremp = d2.empno
LEFT JOIN directory AS d3 ON d2.manageremp = d3.empno
LEFT JOIN directory AS d4 ON d3.manageremp = d4.empno
LEFT JOIN directory AS d5 ON d4.manageremp = d5.empno
LEFT JOIN directory AS d6 ON d5.manageremp = d6.empno
LEFT JOIN directory AS d7 ON d6.manageremp = d7.empno
LEFT JOIN directory AS d8 ON d7.manageremp = d8.empno
WHERE d1.empno = '38414'

ただし、これは必要かどうかに関係なく、8 つの結果すべてを返します。したがって、CEO の 2 段下の人物の階層を取得すると、次のようになります。

d1     d2     d3    d4   d5   d6   d7   d8
13307  55192  10917 NULL NULL NULL NULL NULL

私は本当にこれだけを取得したいのですが:

d1     d2     d3
13307  55192  10917

したがって、前の manageremp が NULL でない場合にのみ、次の empno を選択したいと考えています。しかし、このようなものはうまくいかないようです:

SELECT d1.empno AS d1, 
CASE 
WHEN d1.manageremp IS NOT NULL THEN d2.empno END AS d2, 
CASE 
WHEN d2.manageremp IS NOT NULL THEN d3.empno END AS d3,
CASE 
WHEN d3.manageremp IS NOT NULL THEN d4.empno END AS d4,
...

これにはエレガントな解決策があると確信していますが、私はそれを見ていません。何か案は?

4

0 に答える 0