如何拉出按Ecto中另一个表分组和排序的项目?

时间:2017-04-03 19:21:09

标签: phoenix-framework ecto

我是凤凰城的新手(来自Ruby / Rails),在浏览过文档之后,我无法弄清楚如何在Ecto中表示这个相对简单的SQL查询:

select d.*, t.doc_id, count(*) as cnt 
from taggings t, docs d 
where d.id = t.doc_id 
group by d.id, t.doc_id 
order by cnt desc 
limit 20;

这就是下一行,即我发送给模板的内容:

top_docs = Repo.all(top_docs_query) |> Repo.preload(:tags) |> Repo.preload(:taggings)

我错过了什么?

使用已接受的答案后编辑:

如果您返回计数,则会破坏预加载。今天早上这让我搞砸了一会儿。预加载似乎只有在它只是结构列表的情况下才有效。

这是根据上面的查询完成我想要的最终代码(将App替换为您的应用程序..):

top_docs_query =
  from d in App.Doc,
  join: t in App.Tagging, on: [doc_id: d.id],
  group_by: [d.id, t.doc_id],
  order_by: [desc: count(t.id)],
  limit: 20
  # select: {d, t.doc_id, count(d.id)} <- This is what was breaking the preloading.


top_docs = Repo.all(top_docs_query) |> Repo.preload(:taggings) |> Repo.preload(:tags)

1 个答案:

答案 0 :(得分:1)

以下应该做的工作,但请注意我没有测试过这个:

from t in Tagging,
  join: d in Doc, on: [id: t.doc_id],
  group_by: [d.id, t.doc_id],
  order_by: [desc: count(d.id)],
  limit: 20,
  select: {d, t.doc_id, count(d.id)}