2014-04-16 56 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 | 
+----+------+