如何在 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 中显示它?
通过 SSL 将 phpMyAdmin 连接到 MySQL 服务器