2016-08-24 287 views
-1

我有一個表,其中有sort_no列,排序值屬於q_id,它對應於問題ID。但是,它不包括正確的排序值。有時候,對於不同的記錄,重複的排序號碼將被重複使用相同的q_id。我必須用每個問題的唯一排序編號來重構此表。基於排序列和另一列值重新排序表

這是我已經有了一個簡單的數據:

id | name | sort_no | q_id 
------------------------------- 
1 | val_1 | 1 | 21 
2 | val_2 | 2 | 21 
3 | val_3 | 1 | 32 
4 | val_4 | 3 | 21 
5 | val_5 | 2 | 32 
6 | val_6 | 2 | 32 
7 | val_7 | 1 | 25 
8 | val_8 | 1 | 21 
9 | val_9 | 1 | 21 
------------------------------- 

這是它應該是什麼:

id | name | sort_no | q_id 
------------------------------ 
1 | val_1 | 1 | 21 
2 | val_2 | 2 | 21 
3 | val_3 | 1 | 32 
4 | val_4 | 3 | 21 
5 | val_5 | 2 | 32 
6 | val_6 | 3 | 32 
7 | val_7 | 1 | 25 
8 | val_8 | 4 | 21 
9 | val_9 | 5 | 21 
------------------------------- 

其實,我可以取記錄,並把它們放在一個循環,並更新通過一個循環。但是,如你所知,這需要時間和資源。這張表擁有數百萬條記錄。

我想知道如果我可以直接在MySQL中使用嵌套查詢。

我不知道該查詢。

有沒有人遇到過這個?

+0

我想你已經張貼在同一個表兩次。 – boroboris

+0

@boroboris,nope。看看sort_no – Mojtaba

回答

1
update test5 
    set [email protected]:=if(@grp=q_id,@srt+1,1), 
     [email protected]:=q_id 
where (0,0)=(select @grp:=0,@srt:=0) 
order by q_id, `name` 

設置需要'order by'。 'order by'中的第一列必須是「q_id」。

注:運行此查詢之前,更新安全模式應該被禁用(如果不是默認情況下):

SET SQL_SAFE_UPDATES = 0; 
+0

好的工作。謝謝 – Mojtaba

0

ORDER BY不一定只是一個字段或一個字段列表。它也可以是任意的表達,例如

ORDER BY foo = 42 DESC, foo 

會把所有的記錄與42第一,那麼他們的休息常規數字順序。

如果你能想出一些表達式計算適合所需的排序順序,那麼值...

ORDER BY somefunc(...) 

也將工作。重要的是函數返回的值,這是數據庫將用於執行實際排序的值。

+0

我想操縱當前的數據是我想要的。我沒有選擇任何東西。 – Mojtaba

+0

在支持窗口函數的任何其他數據庫上,這樣做相對容易,但是mysql沒有它們,你不能在客戶端代碼中模擬它們,你只需要咬緊牙關並開始循環記錄集 –

+0

是的。這就是我要做的。我希望我能找到更好的方法。 這個重構應該應用在10個以上的表格上,每個表格可能有數百噸的記錄:( – Mojtaba