【问题标题】:Ruby On Rails retrieve mysql database data 'a' distinct 'b'Ruby On Rails 检索 mysql 数据库数据 'a' distinct 'b'
【发布时间】:2014-10-25 06:08:59
【问题描述】:

我的数据库有一个设备阅读列表,

列是 id ,device_id ,device_reading ,update_time

如何选择每台设备的所有最新读数?

也就是说,我需要先根据 update_time 对数据进行排序

然后我需要使用一些独特的方法(唯一的 device_id)过滤数据库

那么我可以从刚才过滤的行中检索 device_reading。

也就是说,从b不同的表中检索a列

我怎样才能做到这一点?在轨道上的红宝石中

提前致谢

【问题讨论】:

  • device_reading 列中存储了什么样的数据?对还是错?
  • 发布所有与您的设备阅读列表相关的型号将有助于我们了解这个案例。

标签: mysql sql ruby-on-rails ruby greatest-n-per-group


【解决方案1】:

假设模型名称是DeviceReading

DeviceReading.distinct(:device_id).order('update_time DESC').pluck(:device_reading)

如果要按升序排序,可以使用ASC 代替DESC

来源:Distinct and plucksort/order

编辑: distinct 仅适用于 rails 4,因此如果您使用 rails 3,您应该执行以下操作:

DeviceReading.select(:device_id).uniq.pluck(:device_reading)

但是当我在上面链接 .order('update_time DESC') 时,我得到了神秘的错误。我正在努力寻找解决方案。同时我希望这对你有帮助。

来源:distinct undefined error

【讨论】:

  • 当我使用它时错误消息说:未定义的方法`distinct',我使用uniq代替,没有更多错误消息,但结果似乎没有过滤-仍然大量出现
  • 我已经更新了我的答案。我还问了另一个与使用orderselect 相关的问题:stackoverflow.com/questions/25616358/…
【解决方案2】:

这个问题看起来和下面的很相似:

Select first row in each GROUP BY group?

在Rails方式找不到优雅解决方案的情况下,您可以先找出正确的sql并使用find_by_sql检索数据集。

【讨论】:

  • 我不建议在 rails 中编写原始 SQL,因为... (1) 这可以使用 rails active-record helper 来完成,正如我在回答中所展示的那样 (2) 更改数据库时,需要根据新数据库的语法更改原始sql
  • @Uandl,感谢 cmets。我同意你的观点,在 Rails 应用程序中直接使用 SQL 不是最佳实践。它应该是 Rails 不支持的复杂查询的最后选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多