如果出错,重建有序列表

时间:2017-09-28 12:41:00

标签: mysql mysqli

我已经设法使用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的,我还没有完全理解,更别说知道了。我想这可能是,但我需要一些帮助才能朝着正确的方向前进。非常感谢。

1 个答案:

答案 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         |
+----+----+-----------+