Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Ahoj.
Ze tří tabulek z DB vytahuji různé informace, uvidíte níže v kodu. Na web se snažím vypsat tabulku, ve které bude vždy jeden řádek s misí a v dalších kolonkách vyplněná jména těch, kteří je odevzdali - dokončili - nedokončili. Ošetření pomocí PHP mám v pohledu částečně hotové, v dotazu řádky shlukuji podle misí, ale poté mi to vypisuje vždy jedno jmeno a ne třeba tři, kteří vyhovují podmínce.

Dotaz na DB:

Db::dotazVsechny('SELECT uzivatele.jmeno, uzivatele.ID,mojeMise.uzivatel, mojeMise.odevzdano, mojeMise.dokonceno, mojeMise.mise, mise.titulek as jmenoMise '
            . 'FROM mojeMise '
            . 'INNER JOIN mise ON mojeMise.mise=mise.mise_ID'
            . ' JOIN uzivatele
                                  ON mojeMise.uzivatel=uzivatele.ID'
            . '  GROUP BY jmenoMise ORDER BY mise.mise_ID DESC');

kontroler:

$plneni=$spravceUzivatelu->nactiPlneni();
      $this->data['plneni']=$plneni;

a pohled:

<table class="table table-hover table-bordered">
            <thead>
                <tr>
                    <th>Mise</th>
                    <th>Odevzdali</th>
                    <th>Dokončili</th>
                    <th>Nedokončili</th>
                </tr>
            </thead>
            <?php foreach($plneni as $plneni): ?>
            <tr>
                <td><?= $plneni['jmenoMise'] ?></td>
                <td>
                    <?php if($plneni['odevzdano']==1 && $plneni['dokonceno']==0){
                        for($i=0;$i<$pocetOdevzdano;$i++)
                        {
                            echo $plneni['jmeno'];
                        }
                    } ?>

                </td>
                <td><?php if($plneni['odevzdano']==1 && $plneni['dokonceno']==1){

                            echo $plneni['jmeno'];

                    } ?></td>
                <td><?php if($plneni['odevzdano']==1 && $plneni['dokonceno']==2){

                            echo $plneni['jmeno'];

                    } ?></td>
            </tr>
            <?php endforeach; ?>
        </table>

Pokud z dotazu oddělám GROUP BY, tak to vypíše několikrát víc řádků, ovšem dokážu takhle přečíst všechny, kdo to odevzdali/dokon­čili/nedokonči­li..

Poraďte nějakou fintu, kterou v tom pohledu vypíšu víc jmen do <td> pokud třeba víc lidí vyhovuje podmínce :)

Díky

 
Odpovědět 26. února 17:21
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Michal Kuba
Michal Kuba:

Nějaký nápady, prosím? :)

--Ano, trochu se snažím toto vlákno zviditelnit :D

 
Nahoru Odpovědět 26. února 21:52
Avatar
mayo505
Redaktor
Avatar
Odpovídá na Michal Kuba
mayo505:

Ahoj, neviem či to správne chápem, ale podľa mňa zle používaš GROUP BY. Ak ho použiješ, tak v klauzuly SELECT by mali byť len tie stĺpce, ktoré si v ňom použil + agregačné funkcie (SUM,AVG,...). Niektoré databázy to nevyžadujú, ale malo by to viesť k neočakávaným výsledkom.

Pravdepodobne ak odstrániš group by tak dotaz je v poriadku a zoskupiť si to budeš musieť v PHP s načítanými riadkami. Niečo na štýl

$missions = [];
foreach ($queryResults as $row) {
        if (!isset($missions[$row['jmenoMise']]) {
                $missions[$row['jmenoMise']] = [];
        }
        $missions[$row['jmenoMise']][] = [
                // údaje o jednotlivom užívateľovi
                'user' => $row['uzivatel'],
                'status' => $row['dokonceno']
        ]
}
// po tomto budeš mať $missions v tvare
// nazov misie => pole uzivatelov k misii

Iba malé tipy na záver:

  • je výhodné používať angličtinu namiesto češtiny, napríklad ti nebude vznikať divnosť ako
foreach($plneni as $plneni)

dokonca to ani neviem či správne funguje.

  • tabuľky máš akosi zvláštne pomenované (aj keď opomeniem, že nie sú v angličtine) ... asi viem aký je rozdiel medzi mojeMise a mise, ale stále by to šlo rozlíšiť lepšie (napríklad uzivatelovaMise alebo mise_uzivatel)
 
Nahoru Odpovědět 27. února 11:58
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na mayo505
Michal Kuba:

Takže nejlepší je nepoužívat GROUP BY v SQL a pak to v PHP nějak teprve rozškatulkovat? Zkusím, díky

 
Nahoru Odpovědět 28. února 10:58
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Michal Kuba
Jiří Gracík:

Tak to určitě nemyslel, nicméně group by ti zahodí ty zbylé řádky, které mají stejný sloupeček, podle kterého jsi "groupoval". A to se ti zrovna tady moc nehodí.

Nahoru Odpovědět  +2 28. února 11:16
Creating websites is awesome till you see the result in another browser ...
Avatar
mayo505
Redaktor
Avatar
Odpovídá na Michal Kuba
mayo505:

tak ako vraví Jiří, group by sa ti nehodí v tomto prípade, ale v iných prípadoch s ním nie je žiaden problém

 
Nahoru Odpovědět 28. února 11:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.