Group s vnitrni agregaci v Nette/Database

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
saimons
Člen | 293
+
0
-

Potreboval bych udelat tento selecet aby mi vracel Nette/Database/Table/Selection, ale nevim jak tam dostat do selectu agregaci:

SELECT *, MAX(`forumzaznam`.`datumCas`)
FROM `forumvlakno`
LEFT JOIN `forumzaznam` ON `forumvlakno`.`id` = `forumzaznam`.`forumvlakno_id`
WHERE (`forum_id` = 73)
GROUP BY `forumvlakno`.`id`
ORDER BY `forumzaznam`.`datumCas` DESC

Mam napsane neco takoveho, ale vim ze max vraci hodnotu DateTime, takze je to blbost, ale nevim jak to napsat aby me to vytvorilo pozadovany selcet.

$this->database->table('forumvlakno')->where('forum_id', $forum_id)->group('forumvlakno.id')->max('forumzaznam:datumCas')->order('forumzaznam:datumCas DESC');
hrach
Člen | 1836
+
0
-
$this->database->table('forumvlakno')
	->select('MAX(forumzaznam:datumCas)')
	->where('forum_id', $forum_id)
	->group('forumvlakno.id')
	->order('forumzaznam:datumCas DESC');
saimons
Člen | 293
+
0
-

Diky, tohle jsem cetl nekde ve tvych slaidech, ze to tak jde udelat. Ale jakym zpusobem s tim muzu pracovat dale, pokud na to potrebuji pouzit ref() nebo related(). Napriklad vypis uzivatele, ktery vlozil prvni zaznam.

$vlakno = $this->database->table('forumvlakno')
    ->select('MAX(forumzaznam:datumCas)')
    ->where('forum_id', $forum_id)
    ->group('forumvlakno.id')
    ->order('forumzaznam:datumCas DESC');

foreach ($vlakno AS $v) {
	$prvnizaznam = $v->related('forumzaznam', 'forumvlakno_id')->where('hloubka', 0)->fetch();
	$uzivatel = $prvnizaznam->ref('uzivatel', 'uzivatel_id');
}

Napadlo me, ze by z vysledku prvniho selectu sel udelat dalsi, kde by se udelal SELECT do ‚forumvlakno‘ WHERE vysledek z prvniho. Ale prijde me to zbytecne, delat dva selecty.

Editoval saimons (7. 5. 2013 10:15)

saimons
Člen | 293
+
0
-

Aha uz jsem na to prisel, musim do toho selectu vypsat vsechny prvky ktere vyuzivam a id. Zkousel jsem to puvodne takhle ->select(‚*, MAX(forumzaznam:datumCas)‘), ale to mi vrati i data ze druhe tabulky, coz nechci.

hrach
Člen | 1836
+
0
-
->select('MAX(forumzaznam:datumCas)')
->select('forumvlakno.*')
saimons
Člen | 293
+
0
-

Pri testovani jsem se dostal k dalsimu problemu. Nevim jestli to nesouvisi s touto opravou https://forum.nette.org/…yber-sloupcu , protoze mi to delalo popisovanou chybu, tak jsem si upravil dle Gitu kod a vse bylo v poradku. Ale pokud mam napsan nasledujici kod, tak se mi selecty necacheuji spravne a opakuji se. Zda se mi, jak kdyby to bylo zpusobene tim, ze dvakrat v jednom foreach pripojuji stejne tabulky, ale pres jine id.

$vlakno = $this->database->table('forumvlakno')
    ->select('MAX(forumzaznam:datumCas)')
    ->where('forum_id', $forum_id)
    ->group('forumvlakno.id')
    ->order('forumzaznam:datumCas DESC');

foreach ($vlakno AS $v) {
    $prvnizaznam = $v->related('forumzaznam', 'forumvlakno_id')->where('hloubka', 0)->fetch();
    $uzivatel = $prvnizaznam->ref('uzivatel', 'uzivatel_id');
	$tym = $uzivatel->related('tym', 'uzivatel_id')->fetch();
	...vypis..
	$poslednizaznamy = $v->related('forumzaznam', 'forumvlakno_id')
                                ->select('MAX(datumCas) AS datumCas')
                                ->select('CAST(SUBSTRING_INDEX(GROUP_CONCAT(forumzaznam.uzivatel_id ORDER BY datumCas DESC), ",", 1) AS UNSIGNED) AS uzivatel_id, CAST(SUBSTRING_INDEX(GROUP_CONCAT(forumzaznam.id ORDER BY datumCas DESC), ",", 1) AS UNSIGNED) AS id')
                                ->group('forumvlakno_id')->fetch();
	$uzivatelpz = $poslednizaznamy->ref('uzivatel', 'uzivatel_id');
	$tympz = $uzivatelpz->related('tym', 'uzivatel_id')->fetch();
	...vypis..
}
saimons
Člen | 293
+
0
-

Nevite nekdo prosim jak tento problem vyresit. Chova se to zvlastne, pokud dam vise uvedene dve casti samostatne (at jednu nebo druhou), cache funguje v poradku. Pokud je dam spolecne, zacnou se mi opakovat SELECTy a to poctem iterace hlavniho foreache.

saimons
Člen | 293
+
0
-

Toto chovani (chyba pokud se o ni jedna) se mi podarilo nasimulovat i na sandboxo s jednoduchou DB. Mam pro to vytvorit Issue na githubu? Nebo staci dat zdrojaky sem? Nejsem si jist jestli se jedna o chybu, ale je to zvlastni chovani, ze se opakuji stejne SELECTY pri teto konstrukci dotazu.

Editoval saimons (14. 5. 2013 11:40)

hrach
Člen | 1836
+
0
-

github issue.