ファイルが多数のフォルダに属することができるドキュメントマネージャを構築しています(コピーされたアクションがフロントエンドから実行されている場合)。ファイルとフォルダが別のフォルダに属している可能性があることを覚えておいてください。そのデザインでは、私は多くの関係を選択しました。私は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
本当にありがとうございます、あなたの答えは私に正しい方向を指していました。上記の私の質問を見て、正しいバージョンを編集してください。 –
@thanks .. phash ..との回答更新 – scaisEdge