mysql - Mysql] 查找用户以不同角色加入的事件的第一个和最后一个日期
问题描述
我有三张桌子,我需要找到用户作为主持人和客人加入的活动的第一个日期和最后一个(最近)日期。换句话说,返回的数据应该如下所示:
(请注意,这是用户参加的所有活动的第一个和最后一个(最近)日期)
+----+-----+---------+----------------------+-----------------------+-----------------------+-----------------------+
| id |name | Event | First date as a host | Recent date as a host | First date as a guest | Recentdate as a guest |
+----+-----+---------+----------------------+-----------------------+-----------------------+-----------------------+
| 1 | Teo | Dance | 2018-01-01 | 2017-01-01 | 2016-02-01 | 2017-09-09 |
| 2 | Jac | Karaoke | 2018-03-02 | 2018-01-01 | 2016-07-07 | 2017-01-06 |
| 3 | Lay | Boxing | 2017-09-09 | 2018-07-07 | 2017-01-01 | 2018-02-02 |
+----+-----+---------+----------------------+-----------------------+-----------------------+-----------------------+
表
用户
id
名称
事件
ID
名称
starts_at
Event_Users
id
user_id
event_id
角色
我尝试按照此处的说明进行操作[ https://www.periscopedata.com/blog/4-ways-to-join-only-the-first-row-in-sql] ...但是在编写检索 4 个不同的第一行(最小/最大)的查询,我总是以一个超级混乱的查询结束,甚至无法正常工作......
对于这种棘手的要求,最简单的解决方案是什么?
谢谢
解决方案
这遵循相同的模式,需要返回具有两个不同 where 子句的两组数据,但它使用MIN
andMAX
而不是SUM
。
SELECT u.id, u.name, e.name AS Event,
MIN(IF(eu.role = 'host', e.starts_at, NULL)) AS First_date_as_host,
MAX(IF(eu.role = 'host', e.starts_at, NULL)) AS Recent_date_as_host,
MIN(IF(eu.role = 'guest', e.starts_at, NULL)) AS First_date_as_guest,
MAX(IF(eu.role = 'guest', e.starts_at, NULL)) AS Recent_date_as_guest
FROM users AS u
JOIN event_users AS eu ON eu.user_id = u.id
JOIN events AS e ON e.id = eu.event_id
GROUP BY u.id, e.id
推荐阅读
- android - React Native:由于进程无法加载 jdwp 代理,因此未启动调试器
- ios - SwiftUI - 匹配几何效果同步子视图大小
- c# - 我需要看看是否有办法在满足其他条件时结束这个循环
- c# - 如何将两个列表与要在 ASP.NET Core MVC 中复制的键和值合二为一
- android - 当我们在 Jetpack compose 中有 mutableStateOf 时,权限被调用了两次
- r - 如何为每行中的每对观察值创建一个新列 - R 语言
- c# - 执行使用表值参数的存储过程时执行超时到期
- jquery - 数据表 Json 数组作为数据源
- email - 电子邮件已发送,但未收到,排队等待投递
- python - 在 Django 中处理外键