ORDER BY 1

Školení, která pořádám

V klauzuli ORDER BY příkazu SELECT lze kromě názvu sloupce, aliasu ze seznamu sloupců nebo obecného výrazu použít také číselnou konstantu. Ta určuje, podle kterého sloupce ze seznamu sloupců chceme řadit (počítáno od 1). Tento obrat jsem použil jen párkrát (obvykle tomu následovalo získání dat funkcí mysql_fetch_row a ne obvyklou mysql_fetch_assoc), ve většině případů doporučuji dát výrazu ze seznamu sloupců alias a řadit podle něj.

<?php
// vyhledání výrazu v různých tabulkách
$prohledat = array();
if (isset($_GET["prohledat"]["stranky"])) {
    $prohledat[] = "SELECT url, titulek, MATCH(titulek, obsah) AGAINST ('" . mysql_real_escape_string($_GET["search"]) . "') FROM stranky # ...";
}
if (isset($_GET["prohledat"]["novinky"])) {
    $prohledat[] = "SELECT url, nadpis, MATCH(nadpis, zprava) AGAINST ('" . mysql_real_escape_string($_GET["search"]) . "') FROM novinky # ...";
}
if ($prohledat) {
    $result = mysql_query("(" . implode(") UNION (", $prohledat) . ") ORDER BY 3");
    while ($row = mysql_fetch_row($result)) {
        // ...
    }
    mysql_free_result($result);
}
?>

Pokud bychom se bez obratu ORDER BY 3 chtěli obejít, bylo by potřeba vytvořit tolik aliasů, kolik typů objektů prohledáváme. Pokud bychom navíc chtěli použít mysql_fetch_assoc, museli bychom aliasy přidat i sloupcům, které nemají ve všech dotazech stejný název.

Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.

Jakub Vrána, Výuka, 22.12.2006, diskuse: 3 (nové: 0)

Diskuse

Jan Tichý:

"ve většině případů doporučuji dát výrazu ze seznamu sloupců alias a řadit podle něj"

Je to sice asi zřejmé z příkladů, ale stejně by bylo dobré zmínit, že řazení podle aliasů se týká MySQL. Obecně to tak fungovat nemusí, například v PostgreSQL, kde je do ORDER BY nutné místo aliasu vypsat opět znovu celý výraz.

tomh:

Kromě MySQL se to určitě ještě týka Oracle, který umožnuje stejný zápis pomocí čísel.

melda:

mozna uz to tu nekdo nekdy zminil. Pokud chceme vypsat radky v nahodnem poradi lze se mysql dotazat takto:

SELECT * FROM tabulka ORDER BY RAND()

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.