如何从更新表中获取最新状态并将其与 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 中的详细信息表连接?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MySQL 表中获取相同 id 的最新时间戳记录? [复制]