在Postgres

时间:2017-01-18 11:13:28

标签: postgresql join aggregate-functions

说我有两张桌子:帖子嵌入。帖子中的每个帖子都可能有一些与其关联的嵌入,特定顺序必须保留。此查询似乎正常工作,生成如下所示的结果为“Post_embeds”:

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 个答案:

答案 0 :(得分:7)

使用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;

请阅读the documentation:

  

如果指定了WITH ORDINALITY子句​​,则会在函数结果列中添加bigint类型的附加列。此列对函数结果集的行进行编号,从1开始。