>我有以下事件结构,并且有重复发生
活动:(身份证、姓名、地点( 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)')