2016-08-31 2 views
0

フィールドでデータの順序を並べ替える方法は2つのテーブルに存在する?
シーケンスは、フォルダテーブルとファイルテーブルに存在し、どのようにフィールドでデータの順序を並べ替える方法2つのテーブルにクロス/存在する

クエリ

SELECT * FROM folder fo 
    LEFT JOIN file fi ON fi.parent_folder_id = fo.id 
WHERE fo.parent_folder_id = $1 AND fi.parent_folder_id = $1 
    ORDER BY fo.sequence fi.sequence ?? ; << my problem 

[1] 

データ例

folder 
id | sequence | parent_folder_id | name 
1 | 0  |     | root 
2 | 0  | 1    | 
3 | 2  | 1    | 

file 
id | sequence | parent_folder_id | 
1 | 1  | 1    | 

出力

folder(id:1, sequence:0 name:root) 
    folder(id:2, sequence:0) 
    file(id:1, sequence:1) 
    folder(id:3 sequence:2) 
+0

:あなたもリストに親フォルダを含めたい場合は、私は固定された下部可能な順序で別のUNIONとALLサブクエリをそれを追加したいですfi.sequence Gerrat

+0

私はそれらを組み合わせて、問題のような出力で注文したい – user1775888

+0

'fo.parent_folder_id = $ 1 AND fi.parent_folder_id = $ 1'が正しいですか? ANDの代わりにORを意味しないのですか? – MatheusOl

答えて

2

あなたがしたい場合は、それらを一緒にソートします指定されたフォルダーの最初のレベルにあるすべてのファイルとフォルダーを一覧表示するデルは、その後、私はあなたがUNION ALLを使用して、離れて、フォルダのファイルのリストとリストを取得をお勧めします:

(
    SELECT 'folder' AS type, fo.id, fo.sequence, fo.name 
    FROM folder fo 
    WHERE fo.parent_folder_id = 1 
) 
UNION ALL 
(
    SELECT 'file' AS type, fi.id, fi.sequence, NULL 
    FROM file fi 
    WHERE fi.parent_folder_id = 1 
) 
ORDER BY sequence; 

あなたがファイルテーブルの名前を持っていないという奇妙ですが、私はそれはおそらくだけの単純化しすぎだと思います問題。 1つのレコードがfo.sequence

(
    SELECT 'folder' AS type, fo.id, -1 AS sequence, fo.name 
    FROM folder fo 
    WHERE fo.id = 1 
) 
UNION ALL 
(
    SELECT 'folder' AS type, fo.id, fo.sequence, fo.name 
    FROM folder fo 
    WHERE fo.parent_folder_id = 1 
) 
UNION ALL 
(
    SELECT 'file' AS type, fi.id, fi.sequence, NULL 
    FROM file fi 
    WHERE fi.parent_folder_id = 1 
) 
ORDER BY sequence; 
関連する問題