Mysql pořadí řádku v dotazu

Často se Vám může hodit údaj o pořadí řádku ve výsledku dotazu, např. pro různé statistiky a pořadníky soutěží, výsledkové listiny apod., ale hodit se bude i pro jiné úkoly jako zjištění dalšího záznamu, aniž bychom museli procházet tisíce záznamů v aplikační vrstvě.


Mysql a uživatelské proměnné

Poslouží nám k tomu uživatelské proměnné v mysql. Tady je jednoduchý příklad jak vypsat seznam řádků včetně jejich pořadí v dotazu.

  1. SET @poradi:=0;
  2. SELECT @poradi:=@poradi+1, @poradi as poradi, id, name FROM table ORDER BY `name` DESC;

Výhodou je použití různých podmínek pomocí specifikace WHERE, GROUP BY atd., v takových případech je tato funkce nedocenitelná.

Jak zjistit kolikátý řádek vyhovuje podmínce?

Snadné, ale dalo mi to zabrat, než jsem se k tomu dobral :-). K čemu je to dobré? No tak si vezměte příklad: Představte si, že máme stránku detailu hráče na serveru o sportovních výsledcích a chceme zjistit, kolikátý je v pořadí na počty střel, asistencí, v počtu milenek apod.

  1. SET @poradi:=0,@poradib:=0;
  2. SELECT @poradi:=@poradi+1, @poradi as poradi, IF(id=201, @poradib:=@poradi, 0), id, name FROM table ORDER BY `name` DESC;
  3. SELECT @poradib;

Výsledkem je číslo označující pořadí. Samozřejmě si můžeme zvolit řadu podmínek, např. jen hráči české národnosti apod. Když provádíte takových porovnání 10 na jedné stránce, tak není jiné východisko, určitě je to vhodnější než provádět takové porovnání na aplikační vrstvě.

Co třeba přechod na předchozí a další článek?

Pokud nejsou identifikátory souvislé a jsou mezi nimi mezery (1,2,5,6 atd.), nebo se na ně nemůžeme spolehnout, bude se nám hodit zjistit identifikátor následující po určitém záznamu nebo identifikátor záznamu předcházejícího.

  1. SET @poradi:=0,@poradinow:=0, @idnext:=0, @idprev:=0;
  2. SELECT @poradi:=@poradi+1, IF(id=201, @poradinow:=@poradi, 0) FROM table ORDER BY `name` DESC;
  3. SET @poradi:=0;
  4. SELECT @poradi:=@poradi+1, IF(@poradinow-1=@poradi, @idprev:=id, 0), IF(@poradinow+1=@poradi, @idnext:=id, 0) FROM table ORDER BY `name` DESC;
  5. SELECT @poradinow, @idnext, @idprev;

Výsledkem je vrácení pořadí záznamu s ID číslem 201 a jeho předcházející a další prvek. Osobně tento dotaz provádím až ve chvíli, kdy ho opravdu potřebuji. Tedy odkazy na předchozí a nadcházející článek aktivují funkci vyhledání pořadí a zjištění okolních článků, pak se teprve přesměruje na správnou stránku.

Samozřejmě kvůli SEO by bylo vhodné odkazy uzavřít do formuláře nebo odkaz opatřit atributem rel="nofollow", aby další články nebyly indexovány pod url http://www.stranky.cz/nejaky-clanek/next, nebo aby nedocházelo k duplicitám, kde vyhledávače pak článek vidí pod dalšími třemi adresami.

podobné články

06.04.2008Mysql pořadí řádku v dotazu, druhý díl, problém pořadí zpracování uživatelských proměnných(100%)