NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Problém s SQL a PHP dotazem na víc tabulek a jejich výpis

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:26.2.2016 17:21

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.2.2016 17:21
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:26.2.2016 21:52

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

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

 
Nahoru Odpovědět
26.2.2016 21:52
Avatar
mayo505
Tvůrce
Avatar
Odpovídá na Michal Kuba
mayo505:27.2.2016 11:58

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.2.2016 11:58
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na mayo505
Michal Kuba:28.2.2016 10:58

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.2.2016 10:58
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:28.2.2016 11:16

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
28.2.2016 11:16
Neaktivní uživatelský účet
Avatar
mayo505
Tvůrce
Avatar
Odpovídá na Michal Kuba
mayo505:28.2.2016 11:54

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.2.2016 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.