Запрос игнорирует порядок, когда есть несколько left_joins - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь заказать 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")

Однако минимальный пример отображает неинтуитивное поведение, которое я видел.


Это ожидается? И если да, то как это можно обойти?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...