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

Článek navazuje na předchozí díl o zjištění pořadí řádků v dotazu pomocí uživatelských proměnných a řeší problémy, na které můžete s uživatelskými proměnnými narazit. Především rozvíjí příklad s předchozím a příštím článkem.


Mysql, uživatelské proměnné a jejich pořadí zpracování

V přechozím díle Mysql pořadí řádku v dotazu jsme řešili jak získat předchozí a příští článek, tedy jak vytvořit tlačítko další a předchozí. Využili jsme uživatelských proměnných a tohoto dotazu:

  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;

Problém nastane, když je dotaz příliš složitý, obsahuje víc než jeden JOIN, používá složité podmínky WHERE, GROUP BY, složené dotazy apod. Pak se změní pořadí vykonání operací na každém řádku. Nejdříve se vykonají složené dotazy, joiny atd. a teprve potom se bude pracovat s proměnnými. Zkráceně to znamená, že v podmínce IF bude proměnná @poradi nedostupná.

Poddotazy v klauzuli FROM

Problém jsem řešil poddotazem v klauzuli FROM. Tím jsem se mohl spolehnout na dostupnost výsledků proměnných pro jakkoli složitý dotaz. Poddotazy v klauzuli FROM můžete nastudovat přímo v manuálu Subqueries in the FROM clause. Řešení jsem rozdělil na dvě části, ale určitě by se to dalo řešit i v jedné.

První část zjistí pořadí řádku aktuálního záznamu ve výsledku mysql dotazu:

  1. SET @poradi:=0;
  2. SELECT t.rowOrder__Position FROM (SELECT id as rowOrder__Key, @poradi:=@poradi+1 as rowOrder__Position, ".eregi_replace('^select', '', $slozitydotaz).") as t WHERE t.rowOrder__Key='201';

Složitý dotaz jsem rozšířil o sloupec hledaného klíče a pořadí (rowOrder__Key, rowOrder__Position) a doplnil o původní dotaz eregi_replace('^select', '', $slozitydotaz). Tento příkaz odstraní slovo SELECT ze začátku dotazu. Výsledkem složených dotazů je pořadí řádku hledaného klíče.

Další část hledá identifikátor s pozicí o jednu vyšší nebo nižší než pozice aktuálního klíče.

  1. SET @poradi:=0;
  2. SELECT t.rowOrder__Key FROM (SELECT id as rowOrder__Key, @poradi:=@poradi+1 as rowOrder__Position, ".eregi_replace('^select', '', $slozitydotaz).") as t WHERE t.rowOrder__Position='".($poziceaktualnihoidentifikatoruziskanazpredchozihodotazu+($predchozinebodalsi))."';

Proměnná $predchozinebodalsi bude samozřejmě nabývat hodnot 1 nebo -1. Výsledkem je tedy identifikátor okolních řádků.

podobné články

05.04.2008Mysql pořadí řádku v dotazu(75%)