我是凤凰城的新手(来自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)
答案 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)}