【问题标题】:Distinct does not work with select clauseDistinct 不适用于 select 子句
【发布时间】:2023-03-15 18:09:01
【问题描述】:

我有两张桌子

class DepartmentBudget < ApplicationRecord
  has_many :budget_details, dependent: :destroy
end

class BudgetDetail < ApplicationRecord
  belongs_to :department_budget
end

每个部门都有特定时间段的预算。每个部门都有许多budget_details,其中包含所有贷记和借记条目并保持余额。

问题是我想根据最新预算明细的余额对部门预算进行排序。

DepartmentBudget
  .joins(:budget_details)
  .select('budget_details.balance, department_budgets.*')
  .order("budget_details.balance ASC")
  .distinct

我已实现上述查询,但它返回重复记录。问题在于 select 子句,如果我删除 select 然后 distinct 有效,但我必须使用 select with distinct。任何帮助将不胜感激。

【问题讨论】:

  • based on last record of budget detail's balance attribute 这句话令人困惑。属性不能有最后一条记录。只有一个表的最后一条记录可以具有多个属性。请澄清问题
  • 我有更明确的帖子
  • 如果您需要根据最后关联的budget_details 记录应用排序,那么budget_details.created_at 列应该以某种方式参与查询以查找最后创建的记录。你不这么认为吗?

标签: ruby postgresql ruby-on-rails-5


【解决方案1】:
DepartmentBudget.includes(:budget_details).order("budget_details.balance ASC")

【讨论】:

  • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和文档链接。如果没有围绕它的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
【解决方案2】:

不清楚您的目的是什么,但如果我们假设您的 SQL 在逻辑上是正确的,那么您应该使用 GROP BY 子句和聚合函数来实现您的目的。

DepartmentBudget.joins(:budget_details)
                .select('department_budgets.*, MIN(budget_details.balance)')
                .group('department_budgets.id')
                .order("MIN(budget_details.balance) ASC")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多