如何在 Ecto 中进行子查询?

How to make subqueries in Ecto?

我有两张桌子;清单和投标。我想使用 Ecto 列出所有最高出价高于 1 且低于 10 的列表。有关架构和查询的更多信息,请参阅下面的代码。

数据库架构

listings
  id
  name


bids
  listing_id
  amount

program.ex

Repo.all(
  from l in Listing,
  where: (SELECT MAX(amount) FROM bids WHERE listing_id = l.id) > 1 and
         (SELECT MAX(amount) FROM bids WHERE listing_id = l.id) < 10)

怎么办?

Ecto.Query.API.fragment/1 来救援:

join: l in Listing
where: fragment("
  ((SELECT MAX(amount) FROM bids WHERE listing_id = ?) > 1 and
   (SELECT MAX(amount) FROM bids WHERE listing_id = ?) < 10)
", l.id, l.id)

作为 group_by / having 查询:

Repo.all(
  from l in Listing,
  join: b in assoc(l, :bids),
  group_by: l.id,
  having: (max(b.amount) > 1) and (max(b.amount) < 10)
  select: l)