2017-01-18 5 views
1

投稿埋め込みという2つのテーブルがあります。投稿のすべての投稿には、の埋め込み番号が特定の順序で関連付けられている必要があります。このクエリは«Post_embeds»として以下に示す結果を生成、を動作するようです:PostgresでJOINを実行するときに配列内の項目の順序を保持する

SELECT p.id AS pid, array_agg(e.code) AS code 
    FROM posts p, unnest(p.embeds) embed_id 
    JOIN embeds e ON e.id = embed_id 
GROUP BY p.id; 

Tables

あなたが見ることができるように、順序が保存されて埋め込まれています。しかし、その後、私はpost_embedsビューを作成し、このビューを照会してみました:

SELECT * FROM post_embeds WHERE pid=1 

埋め込み機能の順序は消えていました。私は最初のクエリが結局のところ順序を保持することを保証されていないと思うし、それは偶然のためだけでした。

関連する埋め込みのある投稿を正しく照会し、順序を保持するにはどうすればよいですか?

+1

私は、データがないテキストとしてイメージとして掲載されているという理由だけで、これをupvoteしないでください。 –

+1

'WITH ORDINALITY' *はあなたの問題を解決することができますが、代わりにあなたのスキーマを修正するのはどうですか?あなたは 'post_x_embed(post_id、embed_id、order)'のような接合テーブルを持っていて、外部キーを使うことさえできます... – pozs

答えて

6

使用unnest() WITH ORDINALITYと集計で規則性:

SELECT p.id AS pid, array_agg(e.code ORDER BY ordinality) AS code 
    FROM posts p, unnest(p.embeds) WITH ORDINALITY AS u(embed_id, ordinality) 
    JOIN embeds e ON e.id = embed_id 
GROUP BY p.id; 
関連する問題