2011-08-10 17 views
0

私は2つの(関連する)テーブルを含むMySQLデータベースを持っています:Staff、Supervisors。この再帰的なMySQLプロシージャはどのように記述しますか?

スタッフが含まれていますStaffID、名前、CostCentre

とスーパーバイザは含まれています:廃止されたインスタンスID、StaffID、SupervisorID、スタッフの表は、企業内のすべてのスタッフが含まれており、監督テーブルが1 StaffIDリンク

(StaffID )を別のStaffID(SupervisorID)に割り当てる。新しい関係を作成すると(つまり、スタッフAはスタッフBに報告するのではなく、スタッフCに報告しなくなります)、新しいレコードを作成し、元の「廃止」フラグを「true」に設定します。

スーパーバイザーと従属関係が変更される可能性があり、正しいことが保証されていないため、私はこの方法を採用しました。変更し、監査証跡を保持したいと考えています。

私が行う必要があるのは、コストセンターの再帰的なリストを取得することです。

つまり、私はいくつかのコストセンターから始めます。そのコストセンターにいるすべてのスタッフのリストを取得し、すべての従業員のリストを生成します。それから、これらすべてのコストセンターのリストを取得し、それぞれのコストセンターを繰り返します。

私はすでに関連する可能性があるそのうちの2つの手順の数を、持っている:

CALL getCostCentre(iCostCentre) /* get a list of all staff in iCostCentre) */ 
CALL getSupervisees(iSupervisor) /* get a list of all staff who report to iSupervisor */ 

答えて

0

私はのは、従業員を呼びましょう、スタッフや監督者を含む単一のテーブルを作成し、関係を保持するための別のテーブルです(各監査トライアル用の削除フラグフィールドと変更日付フィールドがあるテーブル)。テーブル関係には従属とマスタがあります。また、従業員への参照を保持するコストセンターのテーブル。あなたはダウンロードして(おそらくそれを使用して)最終的にDBを構築する方法を学ぶことができるオープンソースのCRMがいくつかあります。原価センタに関しては、テーブルから学ぶことができます。標準CRMのグループ

+0

これは正確に私のDBの記述方法ではありませんか?私はすべての従業員を含むスタッフテーブルと、1人または複数の従業員をそのマネージャである別の従業員に接続するスーパーバイザテーブルを持っています。私はCRMに興味がありません:私のアプリケーションは非常に具体的です。 – Ozzah

+0

よく、実際には1つだけの違いがありますが、重要です。従業員は2つではなく1つのテーブルがあります。とにかく、私はまだあなたが再帰的な手順について話している理由を理解できません。 BとDの従業員を持つ監督者Aをそれぞれのコストセンターに配置しましょう。 BとDは他の部下の監督者である可能性はありますか?はいの場合、再帰的手続きの必要があり、そうでない場合はそうではありません。 – perissf

+0

いいえ、あなたはとても混乱していると思います。あなたは「私はスタッフとスーパーバイザを含む単一のテーブルを作成し、それを従業員と呼んで、関係を保持する別のテーブルを作成します」と述べました。これは私が何をしたのか_EXACTLY_です。あなたの質問に答えて:もちろんBとDも監督者です:あなたが木の一番下に着くときだけ、従業員のいない従業員が見つかります。私は私の問題が再帰的な問題であることを確信しています。 – Ozzah

関連する問題