按第一个具有模型的许多子项的日期排序



>我有以下事件结构,并且有重复发生

活动:(身份证、姓名、地点( has_many :发生次数

发生次数(ID、日期、event_id( belongs_to :事件

我想获取重复周期大于今天的事件(仅事件数据( (发生日期>Date.Today(

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

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

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

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

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

我需要使用不同来确保我只得到一个事件,无论它有多少次发生

我正在使用 mysql 和 rails5

我正在解释

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

作为最早的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(在组上工作。

对于此任务,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)')

最新更新