对于事件,我具有以下结构
事件:(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
答案 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)')