Group s vnitrni agregaci v Nette/Database
- saimons
- Člen | 293
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');
- saimons
- Člen | 293
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
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
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)