按第一个has的日期排序

时间:2018-10-05 17:47:25

标签: ruby-on-rails activerecord

对于事件,我具有以下结构

事件:(ID,名称,地点) has_many:出现次数

出现次数(ID,日期,事件ID) 当属:事件

我想获取比今天重现的事件(仅事件数据) (occurences.date>日期。今天)

事件应按其下次重复发生的日期(比今天大)按时间顺序排序

以下查询为我提供了事件数据,但不允许我订购

Event.joins(:occurences).where("occurences.date>?",DateTime.now).distinct#.order('occurences.date')

但是我不能订购它,因为它说了

  

ORDER BY子句的表达式#1不在SELECT列表中,引用   列“ eventdatabase.occurences.starts”

无论事件发生了多少次,我都需要使用distinct来确保仅得到一个事件

我正在使用mysql和rails5

2 个答案:

答案 0 :(得分:0)

我正在翻译

  

事件应按其下次重复发生的日期(比今天大)按时间顺序排序

最早的occurance.date

Event.joins(:occurences)
     .where("occurences.date>?",DateTime.now)
     .group(:id)
     .select('events.*, min(occurences.date) as next_recurrence')
     .order('next_recurrence')

一个分组依据就像一个更强大的区别。您将获得一行(一个“组”)。从技术上讲,我们应该按events.*进行分组,但是mysql会作弊并让我们按主键进行分组以完成相同的操作。

进行分组依据时,聚合功能(例如min)在该分组上起作用。

答案 1 :(得分:0)

对于此任务,SQL查询可能类似于:

SELECT E.id AS event_id, MIN(OC.date) AS next_date
FROM events E
  JOIN occurences OC ON OC.event_id = E.id
WHERE OC.date > NOW()
GROUP BY E.id
ORDER BY MIN(OC.date);

这是沙箱:http://rextester.com/HCTE57488

所以我想Ruby代码将是:

Event.joins(:occurences)
     .where('occurences.date > ?', DateTime.now)
     .group('events.id')
     .order('min(occurences.date)')