Mysql使用匹配的外键加入上一行

时间:2017-03-13 02:34:00

标签: mysql join relational-database

我有一张桌子,如下:

|id|jobid|statusid| ... other irrelevant rows...
|1 |123  | 1      |
|2 |321  | 2      |
|3 |123  | 2      |
|4 |321  | 3      |
|5 |123  | 3      |

由于一些不幸的用户错误,当策略在状态2之后使用状态4时,他们最终在大约500个作业上使用(例如)状态3。

如果“statusid”中的值为3,那么当它与它之前的行之间的距离不确定时,如何将行连接到与“jobid”列中的值匹配的前一行?目标是更新表,以便任何3跟随具有相同jobid的2(无论id之间的距离)将被更改为4。

我想要的输出是加入第4行和第2行以及第5行和第3行。 (我知道这个例子一直是id-2,在我的数据库中并非如此。)

到目前为止,关系将是

SELECT mt.id, mt3.id
FROM mytable mt
INNER JOIN (SELECT MAX(mt1.id) AS mid, mt1.jobid
                    FROM mytable mt1
                    WHERE mt1.id < mt.id
                    GROUP BY mt1.jobid) mt2
    ON mt2.jobid = mt.jobid
INNER JOIN mytable tm3
    ON mt3.id=mt2.mid
        AND mt3.statusid = 2
WHERE mt.statusid=3

但子查询中的行 “WHERE sh1.id&lt; mt.id” 是一个不存在的关系,因为mt.id是在子查询之外发起的。

如何让此查询生效?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用相关子查询和另一个联接加入上一行。以下内容将两条记录放在同一行:

select t.*, tprev.*
from (select t.*,
             (select t2.id
              from mytable t2
              where t2.jobid = t.jobid and t2.id < t.id
              order by t2.id desc
              limit 1
             ) as prev_id
      from mytable t
     ) t left join
     mytable tprev
     on t.id = tprev.prev_id;