순서가 있는 엑토

5085 단어 fragmentpostgresecto
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()

좋은 웹페이지 즐겨찾기