【问题标题】:Getting a min(date) AND max(date) AND their respective titles获取 min(date) AND max(date) 及其各自的标题
【发布时间】: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

标签: mariadb groupwise-maximum


【解决方案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 很高兴能帮上忙。这些查询可能会很棘手,尽管使用窗口函数会更容易一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多