Celkový počet záznamů selectu před omezením limit()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TomasHalasz
Bronze Partner | 79
+
0
-

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
+
0
-

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 | 1028
+
0
-

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().