从 Ecto 数据库中获取随机记录

Fetch random records from Ecto database

是否可以仅使用纯 Ecto 查询而不是在应用程序端从数据库中获取 10 条随机记录?例如,我不想从数据库中获取所有记录,然后在 Elixir 中从中获取随机值(像这样):

Subscribers
|> Repo.all
|> Enum.take_random(10)

Ecto 不提供用于检索记录的通用 random 函数,因为底层 databases/schemas 可以( 和 do)以非常不同的方式实现它方式。

但是如果你知道你正在处理的是什么数据库,你可以使用fragment/1 and limit/3 to achieve that. For , you can use them with the RANDOM()函数:

import Ecto.Query

query =
  from Subscribers,
  order_by: fragment("RANDOM()"),
  limit: 10

Repo.all(query)

这相当于调用此 sql 查询:

SELECT * FROM subscribers ORDER BY RANDOM() LIMIT 10

我发现这个问题是为了弄清楚如何获取一个零 parent_task 属性.

的单个随机记录

我想我会 post 我的解决方案,以防它对任何人有帮助。

解决方案 1

如果有人知道如何避免 List.first 并且只使用 Ecto 查询,我将不胜感激!

    query =
      from t in Subscriber,
      where: is_nil(t.parent_task),
      order_by: fragment("RANDOM()"),
      limit: 1

    Repo.all(query) |> List.first

解决方案 2

Repo.all(Subscriber) |> Enum.filter(fn x -> is_nil(x.parent_task) end) |> Enum.random()