我有一张桌子,如下:
|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是在子查询之外发起的。
如何让此查询生效?
谢谢!
答案 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;