我需要将以下SQL转换为Ecto Query DSL。
SELECT otc.*
FROM users u
INNER JOIN one_time_codes otc ON u.id = otc.user_id
LEFT OUTER JOIN one_time_code_invalidations otci ON otci.one_time_code_id = otc.id
WHERE u.id = 3 AND
otc.code = 482693 AND
otci.inserted_at IS NULL AND
otc.inserted_at > all(SELECT otc.inserted_at
FROM one_time_codes otc2
WHERE otc2.user_id = 3) AND
otc.inserted_at > (now() - '180 seconds'::interval);
在AND
子句的第三个WHERE
语句中,请注意有ALL
个查询。 Ecto似乎在Ecto.Query.API
中没有相应的功能。
如何应用此类聚合?实现这一点的正确方法是什么,虽然可以通过查找Ecto的调试日志来实现,但您有其他想法(或建议)吗?
谢谢。
答案 0 :(得分:1)
Ecto不允许在表达式中使用子查询,并且您在Ecto的查询API中没有all
,但您可以使用fragment
这样的:
where: ...
and otc.inserted_at > fragment("all(SELECT otc.inserted_at FROM one_time_codes otc2 WHERE otc2.user_id = ?", 3)
and ...