2017-06-30 11 views
1

ファイルが多数のフォルダに属することができるドキュメントマネージャを構築しています(コピーされたアクションがフロントエンドから実行されている場合)。ファイルとフォルダが別のフォルダに属している可能性があることを覚えておいてください。そのデザインでは、私は多くの関係を選択しました。私は3つのテーブルのフォルダ、ファイル、file_folderここでfile_folderはピボットテーブルです。SQLクエリを3つのテーブルから選択する

私の単純なDBスキーマは以下に定義される:

ファイル:
file_id | name 1 | document.docx

フォルダ:
folder_id | name 1 | root 2 | images

file_folder:

問題は、私は両方のファイルとフォルダのリストを返す結合クエリを作成しようとしていますが、それらが同じフォルダを共有している場合、私は試したクエリのリストですが、目的の結果を返します。

私はかなり私の結果を望むこの方法:私が知っている

file_id | folder_id | name 1 | NULL | document.docx NULL | 2 | images

SELECT * FROM folders dir JOIN file_folder dir_file ON dir_file.dir_id = dir.dir_id JOIN files file ON dir_file.file_id = file.file_id WHERE dir_file.dir_id = 1 ORDER BY dir_file.created_at

SELECT * FROM folders dir,files file JOIN file_folder dir_file ON (dir_file.file_id = file.file_id OR dir_file.dir_id = dir.dir_id) WHERE dir_file.dir_id = 1 ORDER BY dir_file.created_at

はちょうど私がまだ把握できないことを、何かを逃しています。あるいは、DBスキーマを完全に間違っているだけかもしれません。私は実際には、同じテーブルと参照phash(親フォルダ)にファイルとフォルダを配置したくない場合、これは動作しますが、別のものにファイルを含むフォルダをコピーするだけで、そのフォルダ内のファイルではなく、私はそれを実現するためにすべてのサブフォルダとファイルを複製する必要がありますが、これは非常に悪いことです。以下は

今私のために正常に動作します:私はこの

EDITEDへの解決策を得ることができれば、私は感謝します!

SELECT * FROM folders dir LEFT JOIN file_folder dir_file ON dir_file.dir_id = dir.dir_id LEFT JOIN files file ON dir_file.file_id = file.file_id WHERE dir_file.phash = 1 ORDER BY dir_file.created_at

答えて

1

あなたはいつものテーブル間で一致していないという事実に起因しますが、左側に参加インナーとして働くそうでない場合(ON句でWHERE条件を移動・ジョイン

SELECT * 
    FROM folders dir 
    LEFT JOIN file_folder dir_file ON dir_file.dir_id = dir.dir_id and dir_file.phash = 1 
    LEFT JOIN files file ON dir_file.file_id = file.file_id 
    ORDER BY dir_file.created_at 

に参加し、左に使用する必要があります)

+0

本当にありがとうございます、あなたの答えは私に正しい方向を指していました。上記の私の質問を見て、正しいバージョンを編集してください。 –

+0

@thanks .. phash ..との回答更新 – scaisEdge

関連する問題