我有两个数据模型:事件和事件日期。关系是一对多,一个事件可以有多个EventDate。
EventDates有一个日期。 无论附加的EventDates是否应群集,事件都有一个标记“ cluster”。聚类意味着,应将特定事件的所有EventDate作为单个项目还是作为1个项目集群返回。
给出此数据:
EventDates
======================
id | date | event
-----------------------------------
10 | 2020-03-21 | 20
11 | 2020-03-22 | 20
12 | 2020-03-20 | 20
13 | 2020-03-21 | 21
14 | 2020-03-19 | 21
Events
======================
id | cluster
-----------------------------------
20 | 1
21 | 0
我想要按日期排序的EventDates结果。因此返回的数据如下所示:
0 => [ 'id' => 13, 'date' => '2020-03-19', 'count' => 1 ],
1 => [ 'id' => 12, 'date' => '2020-03-20', 'count' => 3 ],
1 => [ 'id' => 14, 'date' => '2020-03-21', 'count' => 1 ],
请注意,EventDates群集的日期是第一个日期。在此示例中,EventDates集群的ID为12
,但是对于我的用例,10
或11
也可以使用。
目前,我可以使用以下SQL语句来实现此目标:
SELECT event_dates.id, events.cluster, MIN(date) as date, COUNT(*) as count
FROM event_dates
LEFT JOIN events on event = events.id
WHERE EXISTS (SELECT * FROM events WHERE event_dates.event = events.id)
GROUP BY (CASE WHEN events.cluster = 1 THEN event_dates.event ELSE event_dates.id END)
ORDER BY date ASC
LIMIT 10 OFFSET 0;
但是,由于event_dates.id
不是GROUP BY
子句的一部分,因此仅在sql模式下取消设置ONLY_FULL_GROUP_BY
才有效。
是否可以通过默认的sql模式(启用ONLY_FULL_GROUP_BY
)获得相同的结果?我可以将每个列包装在伪聚合函数(例如SELECT MIN(event_dates.id)...
)中,以满足ONLY_FULL_GROUP_BY
的限制,但这似乎是一个棘手的解决方法。
侧面说明:真实世界的数据包括成千上万个事件和事件日期。