【问题标题】:Find Latest Child Record (With Conditions) Per Parent Record查找每个父记录的最新子记录(有条件)
【发布时间】:2021-07-26 21:25:52
【问题描述】:

我有 2 个具有父/子层次结构的表,我正在尝试为每条父记录提取最新子记录的 ID,同时还对正在提取的子记录应用条件。

这是我的表格的样子:

-----------
| Quizzes |
-----------
| ID      | 
-----------
| 1       |
| 2       |
| 3       |
-----------

-------------------------------------
| QuizAttempts                      |
-------------------------------------
| ID | QuizID | AttemptedAt         |
-------------------------------------
| 1  | 1      | 2021-01-01 05:00:00 |
| 2  | 1      | 2021-01-01 08:30:00 |
| 3  | 2      | 2021-01-01 05:00:00 |
| 4  | 3      | 2021-01-01 07:00:00 |
| 5  | 3      | 2021-02-01 07:00:00 |
| 6  | 3      | 2021-03-01 07:00:00 |
-------------------------------------

现在,假设我想为尝试从2021-01-01 00:00:002021-01-01 23:59:59 的每个Quiz 提取最新QuizAttempt 的ID,看起来像这样:

------------------------------------------------
| QuizID | QuizAttemptID | AttemptedAt         |
------------------------------------------------
| 1      | 2             | 2020-01-01 08:30:00 |
| 2      | 3             | 2020-01-01 05:00:00 |
| 3      | 4             | 2020-01-01 07:00:00 |
------------------------------------------------

目前,我只是在做一个自引用连接来比较 ID 以获取最新的 QC:

SELECT attempts1.ID
FROM QuizAttempts AS attempts1
LEFT OUTER JOIN QuizAttempts AS attempts2
ON (attempts1.QuizID = attempts2.QuizID
    AND attempts1.ID < attempts2.ID)
WHERE attempts2.ID IS NULL;

这适用于提取最新的子记录。但是,当我添加日期范围条件(例如添加 attempts1.AttemptedAt BETWEEN '2021-01-01 00:00:00' AND '2021-01-01 23:59:59')时,我得到空结果。

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    我建议在子查询中使用窗口函数:

    SELECT qa.*
    FROM (SELECT qa.*,
                 ROW_NUMBER() OVER (PARTITION BY QuizID ORDER BY id DESC) as seqnum
          FROM QuizAttempts qa
          WHERE qa.attemptedat >= '2021-01-01' AND
                qa.attemptedat < '2021-01-02'
         ) qa
    WHERE seqnum = 1;
    

    请注意,日期运算要简单得多,无需处理时间分量。

    编辑:

    您还可以使用相关子查询:

    SELECT qa.*
    FROM QuizAttempts qa
    WHERE qa.id = (SELECT MAX(qa2.id),
                   FROM QuizAttempts qa2
                   WHERE qa2.QuizID = qa.QuizID AND
                         qa2.attemptedat >= '2021-01-01' AND
                         qa2.attemptedat < '2021-01-02'
                  ) qa;
    

    【讨论】:

    • 不幸的是,我认为我不能使用ROW_NUMBER 函数,因为我使用的是 mysql 5.7。
    • 您的编辑是我采用的方法。谢谢!
    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多