sql - 区别和秩序

标签 sql ruby-on-rails ruby-on-rails-3 postgresql arel

这是一个棘手的关系:

我有以下 AR 关系:

# Doctor
has_many :patients, through: :meetings, uniq: true
has_many :meetings

@doctor.patients 按预期工作,没什么了不起的。但现在我想让患者按任务的 created_at 订购医生(最新的优先)。

# Doctor
has_many :patients, through: :meetings, uniq: true, order: 'meetings.created_at DESC'
has_many :meetings

现在这不起作用(在 Postgres 9 上):“错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中”。好吧,让我们这样做:

# Doctor
has_many :patients, through: :meetings, select: 'DISTINCT patients.*, meetings.created_at', order: 'meetings.created_at DESC'
has_many :meetings

这再次起作用,但患者不再是唯一的,因为 DISTINCT 正在处理整个 SELECT 子句。

是否有可能在一个 JOINed 查询中删除重复患者但仍按每个患者的最新 session 顺序获取医生的所有患者?

感谢您的提示!

更新:

根据 Oliver 的提示,我更新了如下关系:

# Doctor
has_many :patients,
  through: :assignments,
  select: 'patients.*, MAX(assignments.created_at) AS last_assignment', 
  group: 'patients.id',
  order: 'last_assignment DESC',
  counter_sql: proc { "SELECT COUNT(DISTINCT patients.id) FROM patients INNER JOIN assignments ON patients.id=assignments.patient_id WHERE assignments.doctor_id=#{id}" }

单独的 counter_sql 似乎是必要的,因为 Rails 替换了整个 select 子句来为 #count 构建 SQL。

有什么方法可以减轻它的体积吗?

最佳答案

尝试使用

    MAX(meetings.created_at)

无处不在。这样,即使患者有多次会面,您也可以获得独特的患者记录。我的示例将选择最新的 session 。如果您更愿意选择第一个,请使用 MIN(meetings.created_at)

关于sql - 区别和秩序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217761/

相关文章:

ruby-on-rails - rails : Setting locale appropriately to IP address

ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本

ruby-on-rails - Rails 控制台 'y' 助手返回 NameError 而不是 yaml 格式输出

ruby-on-rails - 构建获取 IP 的中间件

ruby-on-rails - 如何在 Rails 中 bundle 一个 gem?

ruby-on-rails - routes.rb 中的成员

java - 查询id返回类型

mysql - 简单的多对多sql关系

mysql - 如何将 UPDATE 查询与子查询相结合?

sql - 值 = 字段与字段 = sql 中的值之间的差异