如何解决将GROUP BY与CASE一起使用,并将SELECT与ONLY_FULL_GROUP_BY一起使用
我有两个数据模型:事件和事件日期。关系是一对多,一个事件可以有多个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',
请注意,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
的限制,但这似乎是一个棘手的解决方法。
侧面说明:真实世界的数据包括成千上万个事件和事件日期。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。