Portál AbcLinuxu, 10. května 2025 12:34
user: 1 janko 2 ferko ulohy (jankove): 1 1 1 vyniest kos 2 1 2 umyt riad 3 1 3 domace ulohy ulohy (ferkove): 4 2 1 namalovat plot 5 2 2 vyvencit psaMozem vytvorit unikatny index (task.userId, task.order) ktory mi zabezpeci ze user nebude mat duplicitne poradie uloh, ked zacnem robit operacie ako zmena poradia uloh tak si budem musiet vsetko oprogramovat sam. Napr. ak by som chcel jankovi zmenit poradie "Domace ulohy" z 3 na 1 tak to musim robit takto:
- ulohe 1 priradim nejake pomocne poradie, napr. 4 - ulohe 3 nastavim poradie 1 - ulohe 2 nastavim 3 - ulohe 1 nastavim 2Co sa mi da dost komplikovane. Neunika mi nejaka jednoduchsia cesta? Uvazujme mysql alebo postgres. Napadol ma spojovy zoznam ale tam asi selekt s triedenim podla cisla poradia nebude trivialny. Kazdy user by nemal mat viac ako 200 uloh (resp. za poslednych 5 rokov realnej prevadzky maximum bolo 120) cize ak viete nejake trivialne ale pomale riesenie, nie je problem pouzit aj to.
Řešení dotazu:
ulohe 1 priradim nejake pomocne poradie, napr. 4na co pomocné pořadí, když máme null Každopádně postgres by měl umět DEFERRABLE constraints. Jak MySQL nevím.
UPDATE ulohy SET order = IF(JSEM A, nové pořadí A, nové pořadí B)
V postgresql i v mysql jde k témuž co v mysql dělá IF použít
CASE WHEN ... THEN ... ELSE ... END
.
UPDATE task SET order_ = order_ + 1 WHERE order_ >= NEW.order_ AND user = NEW.user_ ;V before update triggeru:
UPDATE task SET order_ = 0 WHERE id = OLD.id ; IF OLD.order_ > NEW.order_ THEN UPDATE task SET order_ = order_ + 1 WHERE order_ < OLD.order_ AND order_ >= NEW.order_ AND user = NEW.user_ ; ELSIF OLD.order_ < NEW.order_ THEN UPDATE task SET order_ = order_ - 1 WHERE order_ > OLD.order_ AND order_ <= NEW.order_ AND user = NEW.user_ ; END IF;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.