Zajimavá úloha v MYSQL

Publikováno v sekci MYSQL ve Čtvrtek 2.7.2009 - 18:44

Jeden z mých dobrých přátel a kolegů z oboru potřeboval vyřešit zdánlivě jednoduchou úlohu. Dostal tabulku s daty, kde v jednom sloupečku bylo ID (autoincrement) a v druhém textové a číselné hodnoty ( kladná i záporná čísla). Výstupem mělo být "lidské seřazení".

Zkoušel jsem všechny možné funkce MYSQL, nic nefungovalo tak jak jsem potřeboval a kdyz jsem seřadil část tak jak jsem chtěl, druhá část byla třeba obráceně. Nakonec se mi to podařilo tímto dotazem.
SELECT id_hodnota, nazev_cz,
CASE
WHEN LEFT( nazev_cz, 1 ) = '-'
THEN 1
WHEN nazev_cz
REGEXP '^[0-9]'
OR LEFT( nazev_cz, 1 ) = '+'
THEN 2
ELSE 3
END AS own, ABS( nazev_cz ) AS _abs
FROM sablony_hodnoty_copy
ORDER BY own ASC , IF( own =1, _abs, NULL ) DESC , IF( own =2, _abs, NULL ) ASC , nazev_cz ASC
Řekl bych, že zajímavá věc na celém dotazu se skrývá v ORDER BY. Přikládám zároveň i dump tabulky, kdyby si to někdo chtěl zkusit a kdyby někdo přišel na lepší řešení, sem s ním, zajímá mě to. Tento dotaz bude fungovat jen v MYSQL 5+. Zároveň není vhodný na tabulku s větším počtem dat ( toto nebyl můj případ ) Soubor ke stažení (sablony_hodnoty_copy.zip)

bez komentáře « Zpět


Komentáře

Nejsou tu žádné komentáře


Přidat komentář

Nový vzkaz

* Tato pole jsou povinná, [smajlíci]

  • na jiné komentáře odkazujte pomocí odkazu reagovat
  • vaše IP adresa bude zaznamenána
  • používají se gravatary
  • můžeme si tykat
  • HTML tagy vypnuty. PHP kód se také neprovede. Pokud potřebuju přiložit ukázku vašeho kódu, použijete službu pastebin, nebo jej vložte mezi značky [code] [/code]
  • vulgární, rasistické či jinak nepřípustné komentáře budou smazány