如何在 Rails 中选择通过连接到另一个具有多条记录的表的最新记录

Posted

技术标签:

【中文标题】如何在 Rails 中选择通过连接到另一个具有多条记录的表的最新记录【英文标题】:How to select the most recent record in Rails that's via a join to another table with multiple records 【发布时间】:2020-06-17 13:38:44 【问题描述】:

我有一张员工表和另一张就业表。给定的雇员可以有一份或多份工作。我想根据雇佣日期created_at 返回员工关系,但加入他们最近的工作。

我放置了一个 sqlfiddle:http://sqlfiddle.com/#!17/b0a3d/2,但这是基本的 SQL,因此它为每个员工返回一行,并为该员工返回与其最新就业相对应的就业数据。

注意:sqlfiddle 是我从 SQL 的角度思考问题,但我真正想要的是如何通过 Ruby on Rails 做到这一点。如何将Employee 记录与Employment 记录合并,但只提取最新的Employment 记录。 (希望这有助于澄清)。

所以Employee.includes(:employments) 基本上完成了 sqlfiddle 的工作。

我需要一些更花哨的东西来加入员工和就业数据(最近的就业)。

我欢迎任何想法。

【问题讨论】:

他们最近的工作,或最近的积极工作? 他们最近的工作 我觉得这个问题的措辞有点含糊。我创建了一个新的 SO 问题,它更简单,并触及了我的困惑:***.com/questions/60551675/… 【参考方案1】:

在 Postgres 中,您可以使用 distinct on 来解决这个 top-1-per-group 问题:

select distinct on(e.id) e.id, e.name, m.created, m.active
from employees e
inner join employments m on m.employee_id = e.id;
order by e.id, m.created desc;

your DB Fiddle 中,这会产生:

id  name created    active
1   Dan  2019-10-23 false
2   Sam  2019-07-11 true
3   Joe  2019-03-13 false

【讨论】:

谢谢专线小巴!这有帮助。不过,我想也许我并不完全清楚。我希望在 Ruby on Rails 中做到这一点,而不是纯 SQL。 @DanSharp:好吧,我的错。 db fiddle 很吸引人。您可能应该编辑您的问题以显示您当前的 ruby​​ 代码,因此您想要什么是明确的。 在 Rails 代码中添加 distinct on() 应该是相当简单的。【参考方案2】:

这是否达到了你想要的 -

Employee.joins(:employments)
        .select(:id, :name, 'employments.created', 'employments.active')
        .order('employments.created_at desc')

【讨论】:

【参考方案3】:

我会首先通过子查询在Employment 表中找到每个工作的MAX(created),然后在inner join 中找到Employee 表的结果。

subquery = """
SELECT employments.employee_id, MAX(created)
FROM employments
GROUP BY employments.employee_id
"""

Employee.joins("INNER JOIN (#subquery) AS t ON t.employee_id = employees.id")

【讨论】:

以上是关于如何在 Rails 中选择通过连接到另一个具有多条记录的表的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像连接到另一个 ViewController 并在 ImageView 中显示它?

在 MS Access 中插入具有日期范围的多条记录

通过 SSL 将 phpMyAdmin 连接到 MySQL 服务器

arcgis中属性表怎么关联之后保留多条记录

Flutter 如何检查我的设备是不是通过蓝牙连接到另一台设备

如何将 Rails 应用程序连接到主机上的 docker postgres