如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?

Posted

技术标签:

【中文标题】如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?【英文标题】:How to fetch the latest status from a table of Updates and join it with table of details in MySQL? 【发布时间】:2021-04-04 17:22:35 【问题描述】:

我使用的两个表是:

CREATE TABLE `UPDATE_TABLE` (
    `DETAIL_ID` VARCHAR(10), 
    `UPDATE_ID` VARCHAR(10) NOT NULL, 
    `STATUS` ENUM('COMPLETE','INCOMPLETE') NOT NULL, 
    `UPDATED_ON` DATETIME NOT NULL, 
    PRIMARY KEY (`UPDATE_ID`), 
    FOREIGN KEY(`DETAIL_ID`) REFERENCES `TASK_DETAIL` (`DETAIL_ID`)
);

CREATE TABLE `DETAIL_TABLE` (
    `DETAIL_ID` VARCHAR(10) NOT NULL,
    `NAME` VARCHAR(50), 
);

我需要详细信息:DETAIL_ID、NAME、STATUS(最新)、UPDATED_ON 在我的最终结果中。 我目前正在做的是:

SELECT t.* FROM update_table t WHERE UPDATED_ON in ( SELECT MAX(UPDATED_ON) as latest_update FROM update_table group by DETAIL_ID ) 获取最新更新的详细信息,并在 detail_table 上进行左连接。

但是当多个detail_id 具有相同的updated_on 时,问题就来了。 例如:

UPDATE_TABLE:
100,    1,  INCOMPLETE  2021-04-03 17:03:34
200,    2,  INCOMPLETE  2021-04-03 17:03:34
300,    3,  INCOMPLETE  2021-04-03 17:03:34
200,    4,  COMPLETE    2021-04-04 11:50:41

所以这给了我 2 个 detail_id = 200 的更新。 我只需要最新的更新。

SQLAlchemy 查询将是一个很好的奖励!

【问题讨论】:

如果日期/时间列具有相同的值,您如何定义“最新更新”?请记住:SQL 表是无序的。为了进一步混淆,您将第一列定义为主键,但示例中的第一列有重复项。 【参考方案1】:

如果 UPDATE_TABLE 上的 UPDATED_ON 字段从来没有与 1 DETAIL_ID 相同的值,那么这应该适用于您的情况

CREATE TABLE `UPDATE_TABLE` (
    `DETAIL_ID` VARCHAR(10), 
    `UPDATE_ID` VARCHAR(10) NOT NULL, 
    `STATUS` ENUM('COMPLETE','INCOMPLETE') NOT NULL, 
    `UPDATED_ON` DATETIME NOT NULL, 
    PRIMARY KEY (`UPDATE_ID`)
);

Insert into `UPDATE_TABLE` values('100','1','INCOMPLETE','2021-04-03 17:03:34');
Insert into `UPDATE_TABLE` values('200','2','INCOMPLETE','2021-04-03 17:03:34');
Insert into `UPDATE_TABLE` values('300','3','INCOMPLETE','2021-04-03 17:03:34');
Insert into `UPDATE_TABLE` values('200','4','COMPLETE','2021-04-04 11:50:41');
DETAIL_ID UPDATE_ID STATUS UPDATED_ON
100 1 INCOMPLETE 2021-04-03 17:03:34
200 2 INCOMPLETE 2021-04-03 17:03:34
300 3 INCOMPLETE 2021-04-03 17:03:34
200 4 COMPLETE 2021-04-04 11:50:41

这是你需要的:

select ut.*
from `UPDATE_TABLE` ut
inner join (select detail_id, max(updated_on) as 'updated_on'
            from `UPDATE_TABLE`
            group by detail_id) tbl 
            on ut.detail_id = tbl.detail_id and ut.updated_on = tbl.updated_on
order by detail_id

结果:

DETAIL_ID UPDATE_ID STATUS UPDATED_ON
100 1 INCOMPLETE 2021-04-03 17:03:34
200 4 COMPLETE 2021-04-04 11:50:41
300 3 INCOMPLETE 2021-04-03 17:03:34

dbfiddle here

【讨论】:

【参考方案2】:

您可以尝试以下 SQL 查询来获得您需要的结果: 选择不同的(ut.DETAIL_ID),dt.NAME,ut.STATUS,ut.UPDATED_ON FROM UPDATE_TABLE ut,DETAIL_TABLE dt WHERE ut.DETAIL_ID = dt.DETAIL_ID AND ut.UPDATED_ON = (SELECT MAX(UPDATED_ON) FROM UPDATE_TABLE WHERE DETAIL_ID = ut.DETAIL_ID);

【讨论】:

这正是没有给我正确输出的原因,因为 detail_id = 200 我得到了 2 个状态,因为 Max(UPDATED_ON) = 2021-04-03 17:03:34 以及 2021- 04-04 11:50:41 我稍微更新了查询。就获得 2 个状态而言,我在子查询中添加了 where 子句,该子查询将始终返回每个特定 DETAIL_ID 的最大 UPDATED_ON 值。

以上是关于如何从更新表中获取最新状态并将其与 MySQL 中的详细信息表连接?的主要内容,如果未能解决你的问题,请参考以下文章

从状态更新表中有效获取具有给定状态的ID

如何从 MySQL 表中获取相同 id 的最新时间戳记录? [复制]

如何从PHP中的URL获取多个同名参数并将所有记录插入表中

如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?

从mysql数据库中获取最新更新的数据[重复]

如何从标头中正确获取 jwt 令牌并将其与 express 一起使用