Экто с ординальностью

Мы хотим запросить пост, id которого равен 1, 2, 4, 3, и сохранить этот порядок.
Лучшее решение для этого с помощью postgres — WITH ORDINALITY.

SELECT p.*
FROM posts p
JOIN unnest('{1,2,4,3}'::int[]) WITH ORDINALITY t(id, ord) USING (id)
ORDER BY t.order;
Войдите в полноэкранный режим Выйти из полноэкранного режима

Завершить запрос

def list_post_where_id_in_order(ids) do
  query =
    from post in Post,
      inner_join:
        ordinality in fragment(
          "SELECT * FROM UNNEST(?::int[]) WITH ORDINALITY as ordinality (id, num)",
          ^ids
        ),
      on: post.id == ordinality.id,
      order_by: [asc: ordinality.num]

  Repo.all(query)
end

iex> list_post_where_id_in_order([1, 2, 4, 3])
Войти в полноэкранный режим Выйти из полноэкранного режима

Составной запрос

def post_by_id_in_order(query, ids) do
  query
  |> join(
    :inner,
    [post],
    ordinality in fragment(
      "SELECT * FROM UNNEST(?::int[]) WITH ORDINALITY as ordinality (id, num)",
      ^ids
    ),
    on: post.id == ordinality.id,
    as: :ordinality
  )
  |> order_by([post, ordinality: ordinality], asc: ordinality.num)
end

iex> Post |> post_by_id_in_order([1, 2, 4, 3]) |> Repo.all()
Войти в полноэкранный режим Выход из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий