2016-07-19 21 views
4

現在、私はファイル階層(フォルダとファイルは区別されません)をデータベースに格納しなければならないアプリケーションを開発しています。この作成された以下の表の場合:ファイルパスを返すSQLiteの再帰的クエリ

tbl_files 
---------------------------------- 
| id | name | parent | 
---------------------------------- 

親フィールドは、それ自体tbl_filesに対して外来性です。メインディレクトリのIDはrootです。私は今、ルートディレクトリに達するまで、ファイルへのパスを取得したい。私は再帰的なSQLクエリでこれを行うと思ったが、データベースからパスを "返す"方法を知らない。

再帰的クエリは大丈夫ですか、それとも悪い習慣ですか?そして、このクエリを使ってパスをどのように「生成する」必要がありますか?

答えて

4

パスエントリを取得するには、recursive CTEを使用します。 名前を組み合わせるには、group_concat()

WITH RECURSIVE path(level, name, parent) AS (
    SELECT 0, name, parent 
    FROM tbl_files 
    WHERE id = @MyFileID 
    UNION ALL 
    SELECT path.level + 1, 
      tbl_files.name, 
      tbl_files.parent 
    FROM tbl_files 
    JOIN path ON tbl_files.id = path.parent 
), 
path_from_root AS (
    SELECT name 
    FROM path 
    ORDER BY level DESC 
) 
SELECT group_concat(name, '/') 
FROM path_from_root; 
+0

この度はありがとうございます。あなたはまた、このクエリメソッドの効率について何か言いたいことができますか? – Cilenco

+0

これは、エントリを手動で検索した場合と同じように効率的です。しかし、なぜあなたは気にしますか?毎秒何百万というパスを処理する必要がありますか? –

+0

よろしくお願いいたします。私はこのようなものを使ったことは一度もありませんでした。再帰的なスタックサイズなどについて考えましたが、私のクエリではそれほど重要ではないと思います。 – Cilenco