sql - 轨道 3 事件记录 : order and group by association count

标签 sql ruby-on-rails-3 activerecord count associations

我的问题与Rails 3 ActiveRecord: Order by count on association 非常相似

给定相同场景的模型

歌曲有很多 :listens

我想按收听次数对歌曲进行分组。我的目标是查看歌曲的分布与收听次数。像...

song_listen_distribution = {0 => 24, 1 => 43, 2=>11, ... MAX_LISTENS => 1}

这样 song_listen_distribution[4] 就会返回听了 4 次的歌曲数。

上面链接问题的公认答案让我非常接近,但我无法按“songs.listens_count”分组

    Song.select("songs.id, OTHER_ATTRS_YOU_NEED, count(listens.id) AS listens_count").
    joins(:listens).
    group("songs.listens_count").
    order("listens_count DESC")

最佳答案

您正在寻找的内容不能很好地映射到标准 ActiveRecord 查询。

您可以直接调用 SQL 以最有效地获取您正在寻找的内容:

subquery = Song.joins(:listens).group(:id).select("songs.id, COUNT(*) as listen_count").to_sql
raw = Song.connection.select_rows("SELECT listen_count, COUNT(*) FROM (#{subquery}) t GROUP BY listen_count ORDER BY listen_count DESC")
song_listen_distribution = Hash[raw]

或者,您可以使用 ActiveRecord 查找所有歌曲的计数,然后在 ruby​​ 中构建分布字典:

song_listens = Song.joins(:listens).group(:id).count
song_listen_distribution = song_listens.group_by{|n| n.last}.
    each_with_object({}){|(k, g), h| h[k] = g.size}

关于sql - 轨道 3 事件记录 : order and group by association count,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798105/

相关文章:

ruby-on-rails - rails 3 : How to add a module to a model?

ruby-on-rails - 从可安装引擎覆盖主机应用程序的根路由

ruby-on-rails - 具有来自 S3 的 SSL 图像源且没有证书问题的 PayPal 自定义支付页面?

ruby-on-rails - 我可以将模型及其关联之一转换为 YAML 格式吗?

ruby-on-rails - Ruby on Rails 使用设置生成 ActiveRecord 模型

mysql - 子查询返回超过1个值如何解决?

sql - 获取最后一个特殊字符左侧的所有字符 + 最后一个特殊字符之后的 2 个字符 SQL Server

Sql查询获取名称列为空

mysql - 如何优化mysql中的group_concat子查询?

ruby-on-rails - 如何在 ActiveRecords 中创建对 Ruby 对象的引用?