hummingbird
@hummingbird

Как исправить сортировку полученных данных из БД?

Есть такой запрос:
posts_and_images = current_user.posts_and_images.select('DISTINCT ON (post_id) post_id, id, user_id, image_id, position').order(:post_id, position: :desc)


Нужно отсортировать полученные данные только по position, но на деле сейчас полученные данные сортируются по post_id, а сортировка по position игнорируется.

Притом если схитрить таким образом:
.order(position: :desc, post_id: :desc)

То ошибка:
PG::InvalidColumnReference: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1


Точно такая же ошибка, если вообще не указывать "post_id" в ORDER. "post_id" должно всегда находиться в ORDER и всегда должно быть первым, так как используется DISTINCT.

Как исправить?
  • Вопрос задан
  • 471 просмотр
Пригласить эксперта
Ответы на вопрос 2
@jarosluv
Прежде всего нужно понять, что вы вообще хотите получить от запроса? Сформулируйте, пожалуйста, простыми словами и озвучьте.

В вашем запросе без указания сортировки база данных не может понять, по какому принципу отбирать уникальные post_id. Добавив это поле в ORDER BY, запрос начинает проходить, однако следующие уточнения по поводу позиции отбрасываются. Но это тоже логично! Ведь сортировка уточняется только когда по предыдущему полю идут одинаковые значения, а тут по полю post_id все значения разные (благодаря distinct).

Следовательно, вам нужно использовать вложенные запросы. Сначала находим уникальные посты, а потом внешним селектом сортируем по position.
Ответ написан
@artem_music
Разве нет ошибки в коде? Для :post_id ведь надо прописать :desc или :asc, разве нет?
Или попробуйте следующие варианты:
Thing.all.order("updated_at DESC, price ASC")
Model.order(foo: :asc, bar: :desc)
Model.order(:updated_at).order(:price)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы