获取 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
,然后将其两次加入 table2
和 table3
来获得所需的结果,一次以获得每个课程名称:
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