在Ecto中,预加载聚合查询

时间:2017-12-20 15:59:48

标签: elixir ecto

假设我有postscommentsvotes的表格。

votes表的direction列为1,0或-1。

我想查询所有帖子以及评论的计数,以及每个帖子votes.direction总和

这是否可以作为Ecto中的子查询实现,理想情况下在Post模型上使用可组合查询?

目前我所拥有的是:

def count_comments(query) do
  from p in query,
    left_join: c in assoc(p, :comments),
    select: {p, count(c.id)},
    group_by: p.id
end

def get_score(query) do
  from l in query,
    left_join: v in assoc(p, :votes),
    select: {p, sum(v.direction)},
    group_by: p.id
end

但是当我收到此错误时,我无法撰写这两个查询:

  

(Ecto.Query.CompileError)查询中只允许一个选择表达式

1 个答案:

答案 0 :(得分:1)

目前还不清楚你的代码是什么失败了,但可能很有可能完成:

from p in Post,
  left_join: c in assoc(p, :comments),
  left_join: v in assoc(p, :votes),
  group_by: p.id,
  select: {p, count(c.id), sum(v.direction)}

Query compisition仅允许“未终止”查询,对于查询而言,没有select子句(未经测试,可能在您的结构上略有不同):

with_comments =
  from p in Post,
  left_join: c in assoc(p, :comments),
  group_by: p.id

with_score_and_comments = 
  from [p, c] in with_comments,
  left_join: v in assoc(p, :votes),
  group_by: p.id

result =
  from [p, c, v] in with_score_and_comments,
  select: {p, count(c.id), sum(v.direction)}