2016-11-25 11 views
0

私はかなり長い間PHP Webページを構築してきましたが、私はMySQLデータベースに精通していません。私は鉱山のような問題の解決策を徹底的に探しましたが、同様の質問がありましたが、提供されたソリューションの実装方法を理解できませんでした。mysql階層的再帰的クエリ

次のように私は3レベルの階層構造における5つのテーブルを持っている:

Clients (id, name, ...) 
↳ Projects (id, client_id, name, ...) 
    ↳ Contacts (id, project_id, name, ...) 
    ↳ Files (id, project_id, name, ...) 
    ↳ Events (id, project_id, name, ...) 

私はひねりを加えた再帰クエリを達成しようとしています:私は、任意のレベルのIDを提供する場合(レベルを指定してそのIDが属している)、ツリー構造内の親レコードと子レコードの両方のレベルを返す必要があります。

例:私はプロジェクトのIDを持っているので、プロジェクトが属するクライアント(親)とプロジェクトの連絡先、ファイル、およびイベント(子)を返送したいと思います。または、イベントのIDがある場合は、プロジェクト(親)、クライアント(親の親)、連絡先とファイル(イベントと同じレベルにあります)を出力したいと思います。

ポイントは、選択したアイテムの完全な履歴を表示することです。これは1つのクエリでも可能ですか?どんな提案も歓迎され、感謝しています!

このようなクエリは、データセット全体が返されます

答えて

0

:あなたは簡単にこれにWHERE句を添付したり、データセットがそれほど大きくない場合は、単にJavaScriptでフィルタリングまたは類似を扱うことができる

SELECT columns 
    , I 
    , actually 
    , want 
    FROM clients c 
    LEFT 
    JOIN projects p 
    ON p.fk = c.pk 
    LEFT 
    JOIN 
    (SELECT 'contact' type, common, columns FROM contacts 
     UNION 
     SELECT 'file', etc 
     UNION etc 
    ) x 
    ON x.fk = p.pk; 

を。現在の設計では、冗長性が非常に高いことに注意してください。

+0

クイック返信とサンプルありがとう!私は同じパスのように見えます:LEFT JOIN(テーブルの列数が異なるため、UNIONなし)を試しましたが、戻されたデータセットをフィルタリングする方法を理解できませんでした。木構造を作るレベルをどのように区別しますか?そして、私のデザイン(「冗長性」)の弱点を指摘できますか? – laciii

+0

冗長性の例として、連絡先が複数のプロジェクトに関連付けられている場合はどうなりますか?私が知る限り、ここには「レベル」はありませんが、http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-toを参照してください。 -me-to-be-a-very-simple-sql-query – Strawberry

関連する問題