2012-09-14 42 views
1

用數據填充行我有一個看起來大致是這樣的數據:MySQL的:從上一行

user_id range start end 
10  500  1  500 
11  175 
12  200 

,需要把它改造成這樣的:

user_id range start end 
10  500  1  500 
11  175  501  675 
12  200  676  875 

所以後續的每一行的開始數字是上一行的結束數字。當前行的結束編號是起始編號+範圍-1。

我想這樣做純粹是在SQL,但似乎有點卡住,因爲這會產生一個錯誤:

UPDATE users U 
SET  start = (SELECT end+1 FROM users U2 WHERE U2.id = U.id - 1) 
WHERE U.id > 1; 

導致You can't specify target table 'users' for update in FROM clause - 雖然我還在玩弄一個解決方案,似乎無法找到一個。

回答

1

Look at this answer

基本上,使用子查詢

(SELECT end+1 FROM (SELECT end, id FROM users) U2 WHERE U2.id = U.id - 1) 

這是骯髒的改變你的子查詢部分,但它應該工作。要警告的是,如果你的表很大(並且取決於你的mysql服務器上的其他配置值),它會變得很慢,我不建議在生產代碼中使用它。 此外,你正在享受你所有的後續用戶ID,可能並非如此。如果您的id有空白,它會在字段上設置爲空,否則可能會失敗。

如果你有你的ID的差距,你可以做這樣的事情:

(SELECT end+1 FROM (SELECT end, id FROM users) U2 WHERE U2.id < U.id LIMIT 1) 
1

這將是一個緩慢的查詢,如果你有大的表,但你也許能解決這個使用交叉連接。

UPDATE users U CROSS JOIN users U2 
SET U.start = U2.end WHERE U.id = U2.id - 1; 

我也許會考慮有一個額外的字段引用包含用於其起始值的最終值的記錄的想法。這將允許進行高效的自聯接更新,並在您的自動增量存在空白時解決問題。查詢可能看起來像

UPDATE users U INNER JOIN users U2 on U.prev_id = U2.id 
SET U.start = U2.end;