我有一个Ecto查询,它几乎就在那里,但还不完全!
它返回与给定聊天相关的所有消息-但我只想返回每个聊天的第一条消息。
我尝试过使用子查询和片段,但似乎不能正确理解。
Repo.one!(
from(
p in Post,
where: p.id == ^id,
join: c in assoc(p, :chats),
join: y in assoc(c, :messages),
preload: [chats: {c, messages: y}]
)
)
发布于 2018-06-09 03:55:32
defmacro last_message_id(chat_id) do
quote do
fragment("""
(
SELECT
m.ID
FROM
MESSAGES m
WHERE
m.CHAT_ID = ?
ORDER BY m.INSERTED_AT ASC
LIMIT 1
)
""", unquote(chat_id))
end
end
post = Repo.get(Post, id)
chats_with_last_message =
post
|> assoc(:chats)
|> join(:inner, [c], m in Message, m.id == last_message_id(c.id)
|> select([c, m], %{chat: c, message: m})
|> Repo.all()
好了,这应该可以让你开始了。我在这里使用了两个查询,但可以使用this将其放入一个查询中。还要注意INNER
加入,这意味着它会将聊天过滤为至少包含一条消息的聊天。
另外,我没有测试代码,但即使它不能工作,你也能理解。有更多时间的人可能会发布一个适当的答案。
https://stackoverflow.com/questions/50653242
复制相似问题