是否可以编写一个查询,该查询返回所有模型(即 Post)及其关联之一(即 Like)的聚合计数。
Repo.all(from p in Post,
join: l in Like,
where l.post_id == p.id,
group_by: p.id,
select: {p, count(l.id)
我试过使用 group_by 和 select(上面),但这只是部分有效。查询结果排除了所有没有点赞的帖子。
如果这是不可能的,那么处理这个问题的最佳方法是什么?首先想到的是对查询结果进行映射,如下所示:
posts =
Repo.all Post
|> Enum.map(fn(post) ->
likes_query = from l in Like, where: l.post_id == ^post.id
likes_count = Repo.aggregate(likes_query, :count, :id)
%{post: post, likes_count: likes_count}
end)
最佳答案
查询有两处错误:
on
而不是 where
指定连接条件 left_join
而不是 join
如果您希望没有点赞的帖子被退回。 最终查询:
from p in Post,
left_join: l in Like,
on: l.post_id == p.id,
group_by: p.id,
select: {p, count(l.id)}
您也可以使用
assoc
在 left_join
这里将添加正确的 on
自动地:from p in Post,
left_join: l in assoc(p, :likes),
group_by: p.id,
select: {p, count(l.id)}
关于elixir - 我可以在 Ecto 中使用其中一个关联的聚合计数来查询模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42801543/