将GROUP BY与CASE一起使用,并将SELECT与ONLY_FULL_GROUP_BY一起使用

时间:2020-10-07 20:54:47

标签: mysql group-by sql-mode

我有两个数据模型:事件和事件日期。关系是一对多,一个事件可以有多个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,但是对于我的用例,1011也可以使用。

目前,我可以使用以下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的限制,但这似乎是一个棘手的解决方法。

侧面说明:真实世界的数据包括成千上万个事件和事件日期。

0 个答案:

没有答案