Poradie položiek v DB rubrika: Databáze: SQL

2 Juraj Mlich
položil/-a 2.2.2016

Zdravím,

predpokladajme, že máme nasledujúci zoznam projektov:

Project A
Project C
Project D
Project B

Užívateľ má možnosť (klasicky pomocou drag & drop) meniť poradie týchto položiek. RIešenie, ktoré je teda zjavné, je pridať povedzme stlpec order_index, ktoré by bolo číslo reprezentujúce poradie. Mohlo by to teda vypadať takto:

Project A (1)
Project C (2)
Project D (3)
Project B (4)

// číslo v zátvorke je práve onen order_index
Povedzme však, že by sme chceli položku B presunúť pred položku C. Tým pádom by sa zmenil orderindex Céčka a Déčka, bolo by nutné ho inkrementovať o jedno, čo mi príde celkom nepraktické, pokiaľ by sme mali stovky záznamov.

Ako riešite tento problém vy? Mňa už totižto žiadne riešenie nenapadá. Ďakujem.

Komentáře

  • Tomáš Tintěra : Pro volbu algoritmu bych ještě uvažoval: - Jaký je předpokládaný provoz ve špičce. - Může tentýž seznam řadit více lidí současně (třeba i omylem)? - Může se seznam během řazení změnit (nová/smazaná položka)? 6.2.2016
  • Tomáš Tintěra : Opravdu nemá žádný DB engine zabudovanou podporu řazení? Kdo studujete, to zní skoro jako námět na diplomku nebo PhD práci. (Ale nejdříve bych se v ročníkovce podíval, jestli to opravdu někdo nemá). 7.2.2016
  • Kit : @Tomáš Tintěra: Všechny běžné DB engine mají zabudovánu podporu řazení. 7.2.2016
  • Tomáš Tintěra : Ok, měl jsem na mysli zařazení. Čili příkaz v tomto již seřazeném seznamu, dej položku X za Y. 16.2.2016
  • Kit : Podívej se na moji odpověď dole. 16.2.2016
  • kohven : Problémem ve skutečnosti asi nebude změna pořadí existujících položek, ale zařazení nové položky do daného místa v seřazeném seznamu. Protože řazení je opravdu jen prohazování order indexu mezi dvěma položkami. Ale i pro to vkládání bych měl pořád na paměti, že "předčasná optimalizace je kořenem všeho zla". "update tbl set order = order + 1 where order>X" nemusí být u stovek záznamů neakceptovatelné peklo. 23.2.2016
odkaz Vyřešeno
12 Kit
odpověděl/-a 2.2.2016
 
upravil/-a 3.2.2016
UPDATE project SET order_index=CASE
        WHEN order_index=4 THEN 2
        ELSE order_index+1
    END
    WHERE order_index>=2 AND order_index<=4;

EDIT: Uživatelé MySQL mohou použít i kratší variantu:

UPDATE project SET order_index=IF(order_index=4, 2, order_index+1)
    WHERE order_index>=2 AND order_index<=4;

Komentáře

  • podhy : + za CASE - za IF :-) Nicméně pokud je to únosné, tak osobně dávám radši přednost svému řešení, které je trošičku čitelnější (na první pohled) 3.2.2016
  • Kit : @podhy: Co je na IF špatně? Zkoušel jsem obojí a obojí mi funguje. To IF jsem přidal, protože je kratší. 3.2.2016
  • podhy : IF je proprietální rozšíření. CASE dělá stejnou službu (dokonce lepší) a funguje všude 3.2.2016
  • Kit : Tak to jo. Předpokládal jsem, že dotaz je nasměrován na MySQL a proto jsem jiné DB neřešil. 3.2.2016
  • podhy : No vzhledem k tomu, že se tady v diskuzích chytáš za každé slovíčko, tak autor v původním dotazu nic o MySQL nepsal a kategorie dotazu je "Databáze: SQL" :-) 3.2.2016
  • Kit : Trochu jsem upravil komentář ke druhému řešení. Je to už OK? 3.2.2016
  • podhy : Máš tam + :-) 3.2.2016

Pro zobrazení všech 9 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.