Celkový počet záznamů selectu před omezením limit()
- TomasHalasz
- Bronze Partner | 79
Ahoj,
dělám select nad tabulkou a protože v tabulce je hromada záznamů mám v template stránkování. Chci u navigačních tlačítek zobrazit na které stránce z kolika celkem jsem.
Takto si připravuju data do šablony:
<?php
$this->template->cases=$this->cases->getCases($this->getUser()->getId())->order($this->section->cases_order);
?>
Šlo by udělat jednoduše $this->template->cases->count(), ale když přidám do selectu limit() pro zobrazení určitého počtu záznamů od daného offsetu tak mi count() vrátí jen počet záznamů, které jsou omezení tím limitem. Musel bych tedy pokládat dva dotazy. Jeden bez limitu pro zjištění celkového počtu záznamů a druhý s limitem pro získání požadovaných záznamů. Jenže to se mi nelíbilo, protože bych dělal ten samý dotaz dvakrát a tak jsem vymyslel toto:
<?php
$this->template->cases = $this->cases->getCases($this->getUser()->getId())->order($this->section->cases_order);
$pocet=$this->template->cases->count();
$this->template->cases = $this->template->cases->limit($paginator->getLength(),$paginator->getOffset());
$paginator->setItemCount($pocet);
?>
Do template->cases si dám celý výsledek dotazu, z toho vytáhnu počet záznamů a pak udělám opět do template->cases omezení limitem z celého výsledku dotazu, který byl v template->cases předtím.
Funguje to, jen se chci zeptat, jestli je to z principu správně, anebo bych to měl řešit nějak jinak?
díky
- Badaboom
- Člen | 33
V podstatě je to správně. Nemůžeš čekat, že spočítáš počet něčeho, co netaháš z databáze. Před zavoláním count, fetch nebo proiterováním je to pouze připravený dotaz bez dat. Takže když přidáš limit, upravíš dotaz, nikoliv data.
Lepší je používat count('*')
. Bez toho to má tendenci tahat
sloupce, které pak taháš druhým dotazem. A do template bych dával pouze
data, která tam opravdu chceš mít. S $cases
by se určitě
pracovalo líp.
Samozřejmě se nabízí i další možnosti, např. cachování.
Editoval Badaboom (24. 1. 2013 15:58)
- jiri.pudil
- Nette Blogger | 1032
V SQL je na to flag:
SELECT SQL_CALC_FOUND_ROWS `id`, ... FROM `table` LIMIT 0,10
Pak ti
SELECT FOUND_ROWS() LIMIT 1
vrátí počet získaných záznamů bez ohledu na LIMIT. Na NDB by se to
teoreticky dalo naroubovat explicitně v Selection::select()
.