mysql]查找用户加入不同角色的事件的第一个和最后一个日期

ndasle7k  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(366)

我有三张table,我需要找到一个活动的第一个日期和最后一个(最近的)日期,用户已经加入了作为一个主人和客人。换句话说,返回的数据应该如下所示:
(请注意,这是用户参加的所有活动的第一个和最后一个(最近的)日期)

+----+-----+---------+----------------------+-----------------------+-----------------------+-----------------------+
| 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            |
+----+-----+---------+----------------------+-----------------------+-----------------------+-----------------------+

table
用户
身份证件
名称
事件
身份证件
名称
开始于
事件用户
身份证件
用户id
事件id
角色
我试着听从这里的指示[https://www.periscopedata.com/blog/4-ways-to-join-only-the-first-row-in-sql]... 但是,当编写一个检索4个不同的第一行(min/max)的查询时,我总是会得到一个超级混乱的查询,甚至不起作用。。。
对于这种棘手的需求,最简单的解决方案是什么?
谢谢

4uqofj5v

4uqofj5v1#

这与需要返回两组包含两个不同where子句的数据(除了它使用的where子句)的模式相同 MIN 以及 MAX 而不是 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

相关问题