2014-04-16 112 views
0

我正在使用舊版軟件,並且出於很多原因,我無法觸及數據庫模式。 我有一個ID列的數據庫作爲主鍵,也作爲排序條款(「ORDER BY ID」)。我需要一種方法來「重新排序」我的列表。重新排序用作排序子句的主鍵列

舉例來說,如果我有:

ID | Data... 
------------ 
1 | A 
10 | B 
17 | C 
18 | D 

鑑於ID這將是移動記錄「向上」或「向下」的最佳途徑。因此:C - >「向上」,將C的ID改變爲A和B之間;等等。

一切都在MySQL中,如果有幫助。

任何建議,非常感謝。

+0

您的預期結果結果? –

+0

如果「c-> down」 - 那麼爲什麼在'A'和'B'之間?我認爲它應該在'D'之後。還是關於'ID'? (即「down」=「在一個位置上減少ID」) –

+0

是否有任何外鍵引用「ID」?更新級聯? –

回答

0

對於您的問題中的示例數據,可以用簡單的方式顯示結果,但如果data值的差異更大,並且您希望它們在不同位置進行洗牌並放置,則必須在您的應用程序級別或存儲過程中。

對於少量的數據如在你的例子,如果數據'A'不重複,該溶液可以是:

mysql> select * from 
    -> (
    ->    select 1 as id, 'A' as data 
    -> UNION ALL select 18,  'D' 
    -> UNION ALL select 17,  'C' 
    -> UNION ALL select 10,  'B' 
    ->) table_name 
    -> order by field(data, 'C', 'A') desc, data; 
+----+------+ 
| id | data | 
+----+------+ 
| 1 | A | 
| 17 | C | 
| 10 | B | 
| 18 | D | 
+----+------+ 

如果'A'重複幾次,相同的查詢結果如下。但檢查數據行'C'所在的行是否已排在'A'行之後。

mysql> select * from 
    -> (
    ->    select 26 as id, 'X' as data 
    -> UNION ALL select 1,  'A' 
    -> UNION ALL select 18,  'D' 
    -> UNION ALL select 17,  'C' 
    -> UNION ALL select 10,  'B' 
    -> UNION ALL select 15,  'A' 
    -> UNION ALL select 25,  'C' 
    ->) table_name 
    -> order by field(data, 'C', 'A') desc, data; 
+----+------+ 
| id | data | 
+----+------+ 
| 1 | A | 
| 15 | A | 
| 17 | C | 
| 25 | C | 
| 10 | B | 
| 18 | D | 
| 26 | X | 
+----+------+