mysql - 如何在连接表上/使用连接表编写条件?
问题描述
有两种模型 Ticket 和 Account。帐户有很多票。我正在尝试为每个帐户获取最后创建的票证。
accounts = Account.where(:deleted => false).pluck(:id)
tickets = Ticket.left_outer_joins(:account)
.where(:account_id => accounts)
.order(created_at: :desc)
ticket_ids = Array.new
accounts.each do |account|
ticket = tickets.where(:account_id => account).order(created_at: :desc).limit(1).first
if !ticket.blank?
ticket_ids.push(ticket.id)
end
end
@tickets = tickets.where(:id => ticket_ids).order(created_at: :desc)
上面的代码有效,@tickets 包含预期的输出。但问题是上面的代码花费了很多时间。有没有办法在获取查询本身中完成所有这些?或者有什么办法可以优化吗?
我正在使用的数据库:Mysql
解决方案
ticket_ids = Ticket.order(created_at: :desc).group_by(&:account_id).values
@tickets = Ticket.where(id: ticket_ids)
推荐阅读
- java - 如何以编程方式在android中实现文档阅读模式?
- python - 如何对具有相似名称的行求和
- java - Spring boot websocket 出现 500 和 404 错误
- dataframe - 我需要将熊猫数据框中的对象转换为float64
- reactjs - React Native Flatlist 在更新或创建时不会重新渲染?
- python - 如何在 tkinter 中绑定 CTRL-X 事件?
- oracle - Oracle表单中更新主块主键列时需要更新明细块主键列
- php - delete() 在 laravel 8 控制器上不起作用
- logging - Keycloak ERROR_LOG 到日志文件
- angular - Ionic 6. 更新到 cordova 10.0.0 后 Google 地图未显示