Możesz zachować zamówienia jako literały i używać sortowania leksykalnego:
1. A
2. Z
Dodaj zadanie:
1. A
3. L
2. Z
Dodaj więcej:
1. A
4. B
3. L
2. Z
Przesuń 2 między 1 a 4:
1. A
2. AL
4. B
3. L
itp.
Aktualizujesz tylko jeden rekord na raz:po prostu weź średnią literę między pierwszymi, które się różnią:jeśli umieścisz między A
i C
, bierzesz B
, jeśli umieścisz między ALGJ
i ALILFG
, bierzesz ALH
.
Litera obok istniejącego liczy się jako istniejąca, połączona z literą obok Z
. Tj. jeśli potrzebujesz umieścić pomiędzy ABHDFG
i ACSD
F, liczysz to jako pomiędzy ABH
i AB(Z+)
i napisz AB(letter 35/2)
, czyli ABP
.
Jeśli skończy Ci się długość ciągu, zawsze możesz wykonać pełną zmianę kolejności.
Aktualizacja:
Możesz również zachować swoje dane w postaci połączonej listy.
Zobacz artykuł na moim blogu, jak to zrobić w MySQL
:
W skrócie:
/* This just returns all records in no particular order */
SELECT *
FROM t_list
id parent
------- --------
1 0
2 3
3 4
4 1
/* This returns all records in intended order */
SELECT @r AS _current,
@r := (
SELECT id
FROM t_list
WHERE parent = _current
)
FROM (
SELECT @r := 0
) vars,
t_list
_current id
------- --------
0 1
1 4
4 3
3 2
Podczas przenoszenia elementów musisz zaktualizować co najwyżej 4
wiersze.
Wydaje się to być najskuteczniejszym sposobem utrzymywania uporządkowanej listy, która jest często aktualizowana.