2017-03-13 32 views
1

我有一個表,因爲這樣的:Mysql的加入對上一行匹配的外鍵

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

由於一些不幸的用戶錯誤,他們結束了使用(例如)狀態3的一些500個職位當政策是在狀態2後使用狀態4.

當前行與行之間存在不確定的距離時,如何將行連接到與列「jobid」中的值匹配的上一行它,鑑於「statusid」中的值是3?目標是更新表格,以便任何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 

但在該線子查詢閱讀 「哪裏sh1.id < mt.id」 是一種關係,不能exis t起源於子查詢之外的mt.id。

我怎樣才能使這個查詢工作?

謝謝!

回答

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; 
+0

不得不在左連接前添加一個t來讓mysql運行代碼。最後總是讓它加入同一行(1將加入1,2加入2等)。嘗試切換到tprev,從幾千行的表中獲得了幾億的結果,所以可能也不對。也許這只是晚了,我很疲憊,失去了一些明顯的東西? 謝謝! –