我已经设法使用JavaScript,PHP,mysql构建了一个工作拖放排序列表,该列表运行良好。这与可以多次选择要在列表中显示的不同类别的类别系统集成。出于这个原因,我保持所有类别中的条目列表顺序。
我担心的是,如果在某些时候出现问题并且有序列表变得不同步,如何重建它以使数值再次成为连续编号的有序列表。例如:1 - > 1000000000.
我的想法是关于任何重复记录或丢失记录。当发现其中一个错误时;使每个条目高于此错误并重建有序列表。
例如: 破碎的订单列表是:1,2,4,5,6,7,8,9,10 所以重建列表为:1,2,3,4,5,6,7,8,9
或:1,2,3,4,4,5,6,7,8,9 至:1,2,3,4,5,6,7,8,9,10
这将允许有序索引再次正常运行。此查询还将修复此过程中发现的任何其他错误。
这是进入mysql的,我还没有完全理解,更别说知道了。我想这可能是,但我需要一些帮助才能朝着正确的方向前进。非常感谢。
答案 0 :(得分:1)
工作DEMO:
使用用户变量在基表上建立行号(RN),然后使用该RN更新SortOrder。
如果此SortOrder也通过某些分组,我们需要使用第二个(或更多)用户变量来控制RN的重置,以便行号由该组分区。示例:如果每个用户都有排序顺序,那么我们需要重置每个用户的行号,并通过添加新的用户变量更新下面的内容,使用case语句来处理行号的重置,并由用户对我们的子查询进行排序。
但是对于一个没有组的单一列表,下面的内容应该有效。
在子查询中使用二级顺序是明智的,这样我们就可以定义当您有重复值时行显示的顺序(这会使排序唯一,在这种情况下ID可以正常工作);但是,如果你不关心,那么它可能会以未定义的排序顺序发生。
CREATE TABLE SO46469439_Foo (
ID int,
Sortorder int);
INSERT INTO SO46469439_Foo (ID, Sortorder) VALUES (1,1),(2,2),(3,2),(4,4),(5,9);
#Return dataset showing improper SortOrder
SELECT * FROM SO46469439_Foo Order by SortOrder;
#Update dataset to have proper SortOrder no gaps no duplicates.
UPDATE SO46469439_Foo SRC
#This inner join is so that we get a row_number for each SortOrder
#that row number is then used to update sortOrder
INNER JOIN (SELECT A.*, @RN:=@RN+1 RN
FROM SO46469439_Foo A
#Cross join to initialize user variable which we use for row number
#in DBs which support analytical functiosn we would just use Row_number()
# over (partition by Groups order by Groups, sortOrder) to get a RN
CROSS JOIN (SELECT @RN:=0) Z
ORDER BY SortOrder) UP
ON SRC.ID = UP.ID
SET SRC.SortOrder = UP.RN;
#show updated results
SELECT * FROM SO46469439_Foo order by SortOrder
给我们:
improper SortOrder
+----+----+-----------+
| | ID | SortOrder |
+----+----+-----------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 2 |
| 4 | 4 | 4 |
| 5 | 5 | 9 |
+----+----+-----------+
Proper SortOrder. Note:The duplicated 2 is gone and the 9 has been brought in.
+----+----+-----------+
| | ID | SortOrder |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 5 | 5 | 5 |
+----+----+-----------+