Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用条件获取最后修改的行_Mysql_Sql - Fatal编程技术网

Mysql 如何使用条件获取最后修改的行

Mysql 如何使用条件获取最后修改的行,mysql,sql,Mysql,Sql,我提到了以下表格: Table1: ID Unique_Key Date MapId II-10 RTE-011 2018-04-07 15:18:25 er-12-tt II-11 RTE-011 2018-05-17 11:44:47 er-13-td II-12 RTE-011 2018-06-12 13:22:29 ee-

我提到了以下表格:

Table1:

ID        Unique_Key      Date                     MapId
II-10     RTE-011         2018-04-07 15:18:25      er-12-tt
II-11     RTE-011         2018-05-17 11:44:47      er-13-td
II-12     RTE-011         2018-06-12 13:22:29      ee-13-rt
II-13     RTE-012         2018-04-07 19:17:14      eg-15-st
II-14     RTE-012         2018-04-07 21:22:37      hr-15-yt
II-15     RTE-013         2018-07-07 20:27:38      tr-16-yt
II-15     RTE-013         2018-08-07 14:18:33      tr-16-yt

Table2: 

Id              Status
er-12-tt        Open
er-13-td        Closed
er-13-rt        Closed
eg-15-st        Closed
hr-15-yt        Pending
tr-16-yt        Open
tr-16-yt        Pending
通过使用上面提到的两个表,我只想获取那些状态为
已关闭的记录的最新一行

我们需要排除那些唯一的_键,对于这些键,任何值都不等于
Closed

所需的产出将是:

ID        Unique_Key      Date                     MapId          Id         Status
II-12     RTE-011         2018-06-12 13:22:29      ee-13-rt       er-13-rt        Closed
II-13     RTE-012         2018-04-07 19:17:14      eg-15-st       eg-15-st        Closed    

我们可以在这里采用一种常见的方法,并连接到子查询以进行筛选:

SELECT
    t1.ID, t1.Unique_Key, t1.Date, t1.MapId, t2.Id, t2.Status
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.MapId = t2.Id
INNER JOIN
(
    SELECT t1.Unique_Key, MAX(t1.Date) AS max_date
    FROM Table1 t1
    INNER JOIN Table2 t2
        ON t1.MapId = t2.Id
    WHERE t2.Status = 'Closed'
    GROUP BY t1.Unique_Key
) t3
    ON t1.Unique_Key = t3.Unique_Key AND t1.Date = t3.max_date;

别名为
t3
的子查询联接过滤掉每个唯一键的所有记录,但最近一个具有关闭状态的记录除外

为了子孙后代的利益,还有另一种使用解析函数来解决这个问题的方法。考虑到MySQL 8 +将很快成为标准,考虑这个选项也是有意义的:

SELECT
    ID_t1, Unique_Key, Date, MapId, ID_t2, Status
FROM
(
    SELECT t1.ID AS ID_t1, t1.Unique_Key, t1.Date, t1.MapId, t2.Id AS ID_t2,
        t2.Status,
        ROW_NUMBER() OVER (PARTITION BY t1.Unique_Key ORDER BY t1.Date DESC) rn
    FROM Table1 t1
    INNER JOIN Table2 t2
        ON t1.MapId = t2.Id
    WHERE t2.Status = 'Closed'
) t
WHERE rn = 1;

首先,在子查询中,我们确定一组
唯一\u键的最长日期。我们使用具有和(t2.Status=Closed)>0的
过滤掉那些至少有一行的
唯一\u键

然后将此子查询的结果集用作查询。然后将其连接回
表1
表2
,我们使用
筛选出最大状态为
关闭
的情况,其中t22.status='Closed'

尝试:


您能展示一下您尝试了什么吗?您使用的是什么版本的MySQL?您如何知道表2中的最新状态?您的示例数据中有一个输入错误,但除此之外,您正在报告的
RTE-011
记录似乎与状态已关闭的记录关联。我认为这不是正确的预期结果。我不知道我们中哪一个是对的(或者两者都不是)。OP中的逻辑并不完全清楚。@TimBiegeleisen我解释OP的这一行:“我们需要排除那些唯一的_键,任何值都不等于闭合的”@TimBiegeleisen,但他的样本数据集不足以覆盖所有这些边缘情况
SELECT t11.ID, 
       t11.Unique_Key, 
       t11.Date, 
       t11.MapId, 
       t22.Id, 
       t22.Status 
FROM Table1 AS t11 
JOIN Table2 AS t22 ON t22.Id = t11.MapId 
JOIN (
       SELECT t1.Unique_Key, 
              MAX(t1.Date) AS max_Date 
       FROM Table1 AS t1 
       JOIN Table2 AS t2 ON t2.Id = t1.MapId 
       GROUP BY t1.Unique_Key 
       HAVING SUM(t2.Status = Closed) > 0 
     ) AS dt ON dt.Unique_Key = t11.Unique_Key AND 
                dt.max_Date = t11.Date 
WHERE t22.Status = 'Closed'