获取 min(date) AND max(date) 及其各自的标题

Posted

技术标签:

【中文标题】获取 min(date) AND max(date) 及其各自的标题【英文标题】:Getting a min(date) AND max(date) AND their respective titles 【发布时间】:2020-06-18 15:00:14 【问题描述】:

我想从中选择三个表

表 1 有一堆关于用户的静态信息,例如他们的身份证号、姓名、注册日期

表 2 包含用户的 ID 号、课程号和他们注册课程的日期

表 3 有课程编号和课程名称

我正在尝试使用一个查询来选择表 1 中提到的列,包括他们最近注册的课程(注册名称和注册日期)以及他们注册的第一门课程(注册名称和注册日期)

这是我想出来的

SELECT u.idst, u.userid, u.firstname, u.lastname, u.email, u.register_date, 
    MIN(l.date_inscr) as mindate, MAX(l.date_inscr) as maxdate, lc.coursename
FROM table1 u,table3 lc
LEFT JOIN table2 l
ON l.idCourse = lc.idCourse
WHERE u.idst = 12787
AND u.idst = l.idUser

这给了我我需要的一切,而且日期是正确的,但我不知道如何显示两个课程的名称。最新的和第一个。

帮助会很大。

谢谢!!!

【问题讨论】:

您使用的是 mysql 8.0 吗?这可以通过window functions 完成。 为什么需要在一个查询中执行此操作?如果您执行两个单独的查询会更容易。 @BillKarwin 我正在运行一个脚本,该脚本将对超过 100,000 个用户进行 api 调用,所以我正在尝试减少它 @BillKarwin 我正在运行 5.5.60-MariaDB 【参考方案1】:

您可以通过为派生表中的每个用户生成最小/最大 date_inscr,然后将其两次加入 table2table3 来获得所需的结果,一次以获得每个课程名称:

SELECT u.idst, u.userid, u.firstname, u.lastname, u.email, u.register_date,
       l.mindate, lc1.coursename as first_course,
       l.maxdate, lc2.coursename as latest_course
FROM table1 u
LEFT JOIN (SELECT idUser, MIN(date_inscr) AS mindate, MAX(date_inscr) AS maxdate
           FROM table2
           WHERE idUser = 12787
          ) l ON l.idUser = u.idst
LEFT JOIN table2 l1 ON l1.idUser = l.idUser AND l1.date_inscr = l.mindate
LEFT JOIN table3 lc1 ON lc1.idCourse = l1.idCourse
LEFT JOIN table2 l2 ON l2.idUser = l.idUser AND l2.date_inscr = l.maxdate
LEFT JOIN table3 lc2 ON lc2.idCourse = l2.idCourse

正如@BillKarwin 指出的那样,使用两个单独的查询更容易做到这一点。

【讨论】:

我刚刚写了 exact 相同的查询,然后看到了你的答案。干杯! @GMB 我讨厌这种情况! :-) 是的,如果您不刷新,有时其他答案会停止加载...这一切都很好,很高兴您提供了这个查询,这对我来说似乎是正确的方法 @Mat 很高兴能帮上忙。这些查询可能会很棘手,尽管使用窗口函数会更容易一些。

以上是关于获取 min(date) AND max(date) 及其各自的标题的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)

如何从 mysql 查询中存储对象 max(date) 和 min(date)

Oracle VIEW - 将 VARCHAR2 转换为 DATE 并找到 DATE 的 MIN/MAX

如何从跨两个 DATE 列的 INNER JOIN 创建 MIN 和 MAX 日期列,其中每个 DATE 列来自单独的表 BigQuery

将其基于重复记录的两列组合组合在一起创建记录,并分配 Min start_date 和 Max end_date

api级别11之前的Android datepicker min max date