ruby-on-rails-3 - Rails 3 按孙子计数的订单记录

标签 ruby-on-rails-3 postgresql count sql-order-by grandchild

我正在尝试做一些相当复杂的记录排序,但我遇到了一些麻烦。我有三个模型:

    class User < ActiveRecord::Base

    has_many :registers
    has_many :results, :through => :registers

    #Find all the Users that exist as registrants for a tournament
    scope :with_tournament_entrees, :include => :registers, :conditions => "registers.id IS NOT NULL"

end

注册

class Register < ActiveRecord::Base
  belongs_to :user
  has_many :results
end

结果

class Result < ActiveRecord::Base
  belongs_to :register 
end

现在在锦标赛结果页面上,我按总获胜次数列出所有用户(获胜次数是通过结果表计算的)。首先,我找到所有参加过锦标赛的用户,查询如下:

User.with_tournament_entrees

有了这个,我可以简单地遍历返回的用户并使用以下查询每个单独的记录以检索每个用户“Total Wins”:

user.results.where("win = true").count()

不过,我还想更进一步,根据用户的“Total Wins”对所有用户进行排序,这是我能想到的最好结果:

User.with_tournament_entrees.select('SELECT *, 
                                    (SELECT count(*)  
                                     FROM results 
                                     INNER JOIN "registers" 
                                     ON "results"."register_id" = "registers"."id" 
                                     WHERE "registers"."user_id" = "users.id" 
                                     AND (win = true)
                                    ) AS total_wins 
                                     FROM users ORDER BY total_wins DESC')

我认为它很接近,但它实际上并没有按照我指示的那样按 total_wins 降序排列。我正在使用 PostgreSQL 数据库。

编辑:

实际上发生了三个选择,第一个发生在 User.with_tournament_entries 上,它只是对 User 表执行快速过滤。如果我忽略它并尝试

SELECT *, (SELECT count(*) FROM results INNER JOIN "registers" ON "results"."register_id" = "registers"."id" WHERE "registers"."user_id" = "users.id" AND (win = true)) AS total_wins FROM users ORDER BY total_wins DESC; 

它在 PSQL 和 ERB 控制台中都失败了。我收到错误消息:

PGError:错误:列“users.id”不存在

我认为发生这种情况是因为内部选择发生在外部选择之前,因此它无法事先访问用户 ID。不确定如何在内部选择发生之前让它访问所有用户 ID,但是当我执行 User.with_tournament_entires 后跟查询时,这不是问题。

最佳答案

在您的 SQL 中,"users.id" 被错误地引用了——它告诉 Postgres 寻找一个名为“users.id”的列。

它应该是 "users"."id",或者只是 users.id(如果您有一个表/列名,您只需要引用它与 postgres 关键字冲突,或有标点符号或其他不寻常的东西)。

关于ruby-on-rails-3 - Rails 3 按孙子计数的订单记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11128866/

相关文章:

ruby-on-rails - 在 Rails 3.1 中,如何创建使用 block 样式格式的 HTML 表格生成器

postgresql - 为同一台服务器上不同数据库上的同一用户分配不同的角色

postgresql - 将更新的文件导入数据库

sql - 使用 WHERE 和 AS 从数据库中提取数据

MYSQL 选择计数 > 1 的地方

MySQL:SELECT(x) WHERE 与 COUNT WHERE?

ruby-on-rails - 判断 Controller 是否在 Rails 3 的嵌套路由中使用

ruby-on-rails-3 - 创建迁移时如何将默认值设置为 rails 中的列

javascript - 如何通过选择选项列表来提高性能或更改动态加载模板的方法?

file - 如何使用shell脚本计算文件和子目录的数量?