Řekněme, že máme nějaký seznam záznamů řazený třeba podle názvu a v detailu každého záznamu chceme zobrazit informaci o tom, kolikátý v seznamu je, a odkaz na předchozí a následující záznam.
Pokud je základní dotaz SELECT * FROM `clanky` ORDER BY `nadpis`
, můžeme pořadí zjistit dotazem SELECT COUNT(*) FROM `clanky` WHERE `nadpis` <= @nadpis
, kde @nadpis
je nadpis aktuálního článku. Problém vznikne v případě, kdy se dva články jmenují stejně – u nich se vrátí pořadí posledního článku daného jména.
Vyřešit se to dá přidáním nějakého unikátního sloupce do řazení i do podmínky: z ORDER BY `nadpis`, `id`
vznikne WHERE (`nadpis`, `id`) <= (@nadpis, @id)
nebo složitější WHERE `nadpis` < @nadpis OR (`nadpis` = @nadpis AND `id` <= @id)
. To také dává návod na to, jak postupovat při řazení podle více sloupců. U dotazů používajících agregaci lze dotaz zjišťující počet obvykle položit bez agregace. Pokud to nejde, lze to vyřešit poddotazem.
Odkaz na předchozí záznam se dá zjistit dotazem SELECT * FROM `clanky` WHERE (`nadpis`, `id`) < (@nadpis, @id) ORDER BY `nadpis` DESC, `id` DESC LIMIT 1
, odkaz na následující záznam obdobně. Pokud už máme zjištěné pořadí záznamu, dá se použít také "SELECT * FROM clanky ORDER BY nadpis, id LIMIT 1 OFFSET " . ($poradi - 2)
.
Diskuse je zrušena z důvodu spamu.