重新排序用作排序子句的主键列

时间:2014-04-16 14:06:19

标签: mysql sql sorting

我正在使用遗留软件,由于种种原因我无法触及数据库架构。 我有一个ID列的数据库,它作为主键,也作为排序子句(“ORDER BY ID”)。我需要一种方法来“重新订购”我的清单。

例如,如果我有:

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

鉴于ID,将记录“向上”或“向下”移动的最佳方式是什么。 那样:C - > “up”,会将C的ID改为A和B之间;等等。

如果有帮助的话,一切都在MySQL中。

非常感谢任何建议。

1 个答案:

答案 0 :(得分: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    |
+----+------+