U kunt orders als letterlijke waarden behouden en lexicale sortering gebruiken:
1. A
2. Z
Een taak toevoegen:
1. A
3. L
2. Z
Voeg meer toe:
1. A
4. B
3. L
2. Z
Verplaats 2 tussen 1 en 4:
1. A
2. AL
4. B
3. L
enz.
U werkt slechts één record tegelijk bij:neem gewoon een gemiddelde letter tussen de eerste die verschillen:als u tussen A
plaatst en C
, neem je B
, als je tussen ALGJ
. plaatst en ALILFG
, neem je ALH
.
Letter naast bestaande telt als bestaand aaneengeschakeld met de letter naast Z
. ik. e. als je tussen ABHDFG
moet zetten en ACSD
F, je telt het als tussen ABH
en AB(Z+)
, en schrijf AB(letter 35/2)
, dat is ABP
.
Als u geen string meer heeft, kunt u altijd een volledige herordening uitvoeren.
Bijwerken:
U kunt uw gegevens ook als een gelinkte lijst bewaren.
Zie het artikel in mijn blog over hoe je dit doet in MySQL
:
In een notendop:
/* 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
Als je de items verplaatst, moet je maximaal 4
. updaten rijen.
Dit lijkt de meest efficiënte manier om een geordende lijst bij te houden die regelmatig wordt bijgewerkt.