Archiv pro štítek: MySQL

Proměnné v MySQL aneb používáme alias v SELECT dotazu

Narazil jsem na výbornou syntaktickou pomůcku v MySQL, která mi okamžitě začala zjednodušovat život. Stává se mi totiž, že potřebuji s hodnotou jednoho sloupce pracovat v jiném sloupci. Při použití standardních aliasů vytvořených s pomocí AS však narážím na problém.

Následující metoda představuje přímočarý postup, který však není funkční.

SELECT (1 + 1) as soucet, soucet + 1

Databáze u druhého sloupce ukončí provádění dotazu s tím, že nezná soucet, i když se jedná o alias předcházejícího sloupce.

Kýženého efektu dosáhneme díky proměnným. Těm se přiřazují hodnoty zápisem @jmeno:=hodnota. Aktuálně uchovávaný údaj vrátí @jmeno. Výše uvedený příklad by po nasazení proměnných vypadal takto:

SELECT @soucet:=(1 + 1) as soucet, @soucet + 1

Rázem získáváme číslo 2 a v druhém sloupci správný součet 3.

MySQL - proměnné

MySQL: Řazení sloupce s NULL hodnotami

MySQL - řazeníNedávno jsem potřeboval seřadit tabulku podle sloupce, jenž zastupoval cenu. Ne vždy však byl tento údaj vyplněn a objevovaly se proto i hodnoty NULL. To by nevadilo, pokud bych vyžadoval sestupné pořadí, tedy od největší ceny po nejmenší. Řádky s NULL by se v tomto případě ukázaly poslední. Já však toužil po přesném opaku. Jako první se měla projevit nejmenší cena. Tvrdohlavě však tuto příčku okupovaly hodnoty NULL a donutily mě začít hledat chytré řešení.

Vše lze pohodlně vyřešit s pomocí dotazu. Ten vypadá následovně:

SELECT cena FROM tabulka ORDER BY case when cena is null then 1 else 0 end, cena

Nejzajímavější je pochopitelně klauzule ORDER BY. S pomocí case vytvořím jednoduchou podmínku, jenž nahradí NULL za 1. Vyplněné ceny naopak zaměním za 0. Nyní jsem docílil toho, že řádky s NULL se ve výpisu objeví jako poslední. To odpovídá seřazení nul a jedniček dle defaultního (neuvedeného) vzestupného pořadí. Následně již zbývá vykonat poslední krok. Postarat se o správné začlenění řádků s uvedenou (neprázdnou) hodnotou. To je již velmi jednoduché, stačí do klauzule ORDER BY dosadit druhý sloupec (v mém konkrétním případě pojmenovaný jako cena). Ten si rovněž automaticky vyžádá vzestupné pořadí. Výsledkem je kýžený seznam s nejnižším číslem na svém počátku.

MySQL – řazení dle písmen a číslic

MySQL - řazeníPro aplikaci vytvářenou na operační systém Android jsem potřeboval zajistit výpis ze vzdáleného serveru. Vytvořil jsem si proto příslušný PHP skript, který měl za úkol vypsat z databáze názvy dostupných seriálů, ty přeměnit do formátu JSON a předat je na stranu klienta v podobě chytrého mobilního telefonu, který tato data následně použije a zobrazí. Problém překvapivě nastal během vytváření dotazu. Ten jsem klasicky v jeho závěru obohatil o klauzuli ORDER BY a byl poněkud zklamán výsledkem. Chování přesně odpovídalo ASCII tabulce, což znamená, že se nejprve objevily seriály začínající číslicí a teprve poté následovaly položky obsahující na první pozici písmeno. Osobně mi připadá přirozenější obrácené pořadí, a proto jsem začal hledat způsob, jak takového cíle dosáhnout.

Po chvíli jsem narazil na řešení spočívající v nasazení dvou řadících operací zároveň. Ve stejné době mi došlo, jakým způsobem budou řetězce složené z čísel interpretovány. Máme-li například trojici 1, 2, 10, objeví se jako 1, 10, 2, protože ctí pravidla pro zacházení s textem. K převodu na číslo poslouží trik, který znám z JavaScriptu. Jednoduše stačí provést číselnou operaci, jenž nezmění výsledek, tedy například vynásobení jedničkou nebo přičtení nuly.

Vraťme se ale nyní k samotnému seřazení. Nejprve zaměníme pořadí u řádků na základě převodu zvolené hodnoty na číslo. Druhá část řazení následuje ihned poté, tentokrát však již bere v potaz textovou reprezentaci. Hotový dotaz v mém případě vypadal takto:

SELECT * FROM shows ORDER BY (name * 1) ASC, name ASC

Jak již vás patrně napadá, sloupec name udržoval název daného seriálu, shows naopak slouží k identifikaci celé tabulky.

Stane-li se, že pořadí písmen následovaných číslicemi nevyhovuje, stačí jednoduše vyměnit obě součásti klauzule ORDER BY:

SELECT * FROM shows ORDER BY name ASC, (name * 1) ASC

Nyní výpis v čele ovládnou číselné údaje s plynulým navázáním záznamů, kde se první znak nese v duchu písmena.