【问题标题】:Nested SQL SELECT in Rails 4Rails 4 中的嵌套 SQL SELECT
【发布时间】:2016-03-27 18:40:37
【问题描述】:

我正在寻找一种在 Rails 中生成以下 SQL 的方法(使其成为范围),以便我可以将其与进一步的 scopes 链接起来(例如 Article.published.most_comments):

SELECT *, cs.count
FROM articles, (
  SELECT article_id, count(*)
  FROM comments
  GROUP BY comments.article_id
) cs
WHERE articles.id = cs.article_id
ORDER BY cs.count DESC;

我已经尝试过类似Article.joins(:comments).select('*').group('comments.article_id') 的方法,但没有生成所需的 SQL:

SELECT * FROM "articles"
INNER JOIN "comments" ON "comments"."article_id" = "articles"."id"
GROUP BY comments.article_id

(PSQL): PG::GroupingError: ERROR:  column "articles.id"
        must appear in the GROUP BY clause or be used in
        an aggregate function

而且似乎没有 .from 方法可以在其中指定嵌套的 SQL SELECT。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


    【解决方案1】:

    其实有一个.from method

    scope :most_comments, -> {
      Article.select('*, cs.count').from(
        'articles, (
          SELECT article_id, count(*)
          FROM comments
          GROUP BY comments.article_id
          ) cs'
        )
        .where('articles.id = cs.article_id')
        .order('cs.count DESC')
    }
    

    不确定这是否是最好的方法,但它有效......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多