我正在使用遗留软件,由于种种原因我无法触及数据库架构。 我有一个ID列的数据库,它作为主键,也作为排序子句(“ORDER BY ID”)。我需要一种方法来“重新订购”我的清单。
例如,如果我有:
ID | Data...
------------
1 | A
10 | B
17 | C
18 | D
鉴于ID,将记录“向上”或“向下”移动的最佳方式是什么。 那样:C - > “up”,会将C的ID改为A和B之间;等等。
如果有帮助的话,一切都在MySQL中。
非常感谢任何建议。
答案 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 |
+----+------+