Я пытаюсь заказать Posts
по их коэффициенту конверсии, который представлен unique commenters/impressions
. У меня есть запрос, который выполняет вычисления, но упорядочение по этим вычислениям не выполняется. Изучив его, кажется, что order
ломается, когда я соединяю две таблицы, даже если запрос остался прежним. Вот минимальный пример:
# Works as expected
Post.left_joins(:impressions)
.group(:id)
.order("count(impressions) DESC")
# Orders seemingly randomly
Post.left_joins(:comments, :impressions)
.group(:id)
.order("count(impressions) DESC")
Вот сгенерированный SQL из этих запросов:
-- Works as expected
SELECT "posts".* FROM "posts"
LEFT OUTER JOIN "impressions" ON "impressions"."post_id" = "posts"."id"
GROUP BY "posts"."id"
ORDER BY count(impressions) DESC
-- Seemingly random order
SELECT "posts".* FROM "posts"
LEFT OUTER JOIN "comments" ON "comments"."post_id" = "posts"."id"
LEFT OUTER JOIN "impressions" ON "impressions"."post_id" = "posts"."id"
GROUP BY "posts"."id"
ORDER BY count(impressions) DESC
Я использую Postgres и Rails 5.2
На самом деле запрос будет выглядеть примерно так:
Post.left_joins(:comments, :impressions)
.group(:id)
.order("cast(count(distinct(comments.user_id)) AS float) / cast(greatest(count(impressions), 1) AS float) DESC")
Однако минимальный пример отображает неинтуитивное поведение, которое я видел.
Это ожидается? И если да, то как это можно обойти?