A co z użyciem integer
kolumna określająca kolejność? Domyślnie przypisujesz liczby * 1000, na przykład 1000, 2000, 3000.... a jeśli przesuniesz 3000 między 1000 a 2000, zmienisz je na 1500. Więc w większości przypadków nie musisz w ogóle aktualizować innych liczb. Używam tego podejścia i działa dobrze. Możesz także użyć double
ale wtedy nie masz kontroli nad dokładnością i błędami zaokrąglania, więc raczej go nie używaj.
Tak więc algorytm wyglądałby tak :powiedzmy, że przenosisz B na pozycję po A. Najpierw wykonaj wybierz, aby zobaczyć kolejność rekordu obok A. Jeśli jest ona co najmniej +2 wyższa niż kolejność A, po prostu ustaw kolejność B, aby zmieścić się pomiędzy. Ale jeśli jest tylko o 1 więcej (nie ma spacji po A), wybierasz sąsiadujące rekordy B, aby zobaczyć, ile miejsca jest po tej stronie, dzielisz przez 2, a następnie dodajesz tę wartość do kolejności wszystkich rekordów między A i B. To wszystko!
(Pamiętaj, że powinieneś używać transakcji/blokowania dla dowolnego algorytmu, który zawiera więcej niż jedno zapytanie, więc dotyczy to również tego przypadku. Najprostszym sposobem jest użycie transakcji InnoDB.)