NDBT bug? Dva selecty na rovnaké dáta
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Čamo
- Člen | 798
Zdravím,
Prejdem rovno k veci.
Vyberám články z databázy a stránkujem ich.
$articles = $blogArticles->findCategoryArticles($cat_ids);
$vp = $this['vp'];
$paginator = $vp->getPaginator();
$paginator->itemsPerPage = 7;
$paginator->itemCount = count($articles);
$this->template->articles = $articles->limit($paginator->itemsPerPage, $paginator->offset);
Toto vyprodukuje dva selecty:
SELECT `id`
FROM `blog_articles`
WHERE (`status` = 1) AND (`id` IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 17, 18, 19, 70, 72, 22,
69, 25, 26, 29, 30, 27, 28, 23, 20, 21, 24))
ORDER BY `created` DESC
SELECT `id`
FROM `blog_articles`
WHERE (`status` = 1) AND (`id` IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 17, 18, 19, 70, 72, 22,
69, 25, 26, 29, 30, 27, 28, 23, 20, 21, 24))
ORDER BY `created` DESC
LIMIT 7
Ten druhý vyberá neviem prečo iba id. To spôsobí že pri výpise v šablone sa urobí ešte jeden select:
SELECT *
FROM `blog_articles`
WHERE (`status` = 1) AND (`id` IN (31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 45, 46, 48,
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 17, 18, 19, 70, 72, 22,
69, 25, 26, 29, 30, 27, 28, 23, 20, 21, 24)) AND (`blog_articles`.`id` IN (72, 63, 62, 61, 60, 20,
59))
ORDER BY `created` DESC
Má to nejaké vysvetlenie, alebo čo to je?
Ďakujem.
- David Matějka
- Moderator | 6445
Pro pocitani zaznamu pouzivej $articles->count('*')
, to tvoje
count($articles)
vybere vsechny zaznamy (resp jejich id) a spocita
velikost pole, coz je hodne neefektivni.