在Ecto中,预加载聚合查询

问题描述 投票:0回答:1

可以说我有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)查询中只允许一个select表达式

elixir ecto
1个回答
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)}
© www.soinside.com 2019 - 2024. All rights reserved.