tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Pomoc se složením SQL dotazu

před 10 lety

weckho
Člen | 100

Ahoj,

potřeboval bych poradit se složením SQL dotazu. Mám dvě tabulky, v jedné mám názvy kurzů, v druhé datumy (ke každému kurzu je několik datumů). A potřebuji na stránku vypsat vždy název kurzu + všechny datumy, kdy se kurz koná. Nevím si rady s tím, jak to všechno vytáhnout z DB v jednom dotazu.

Děkuji za každou radu.

před 10 lety

Ondřej Brejla
Člen | 748

Když sem vypíšeš všechny sloupce obou tabulek, tak ti dotaz napíšem, takhle těžko ;-)

SELECT nazev_kurzu, datum_kurzu FROM nazvy_kurzu JOIN data_kurzu USING id_kurzu

Přibližně takhle nějak ;-)

před 10 lety

Ondřej Mirtes
Člen | 1539

Já bych použil ještě GROUP BY na kurzy a pak si ty ztracené datumy vytáhnul přes GROUP_CONCAT :)

před 10 lety

Ondřej Brejla
Člen | 748

Ano, grupování a concatování je určitě přesně to, co potřebuje člověk, který netuší, jak udělat obyč join ;-)

Ale proč ne :-D

před 10 lety

Ondřej Mirtes
Člen | 1539

Asi jsem ho hodil do ledový a hluboký vody, ale v týhle podobě to z databáze dostane v nejpohodlnější podobě :)

před 10 lety

Ondřej Brejla
Člen | 748

To je otázka vkusu, potřeby a aktuálního rozpoložení programátora :-D

před 10 lety

weckho
Člen | 100

Pár dnů jsem se k tomu nedostal, ale vídím, že thread žije sám i beze mě :)

Potřebuji to jinou syntaxí, můj (neúspěšný) pokus byl:

return $this->db->select('%n.*, %n AS `popisek`', $this->kurzy, $this->datumy . '.popisek')

                ->from($this->kurzy)

                ->leftJoin($this->datumy)

                ->on('%n = %n', $this->kurzy . '.id', $this->datumy . '.id_kurzu')

                ->groupBy($this->kurzy . '.id');

Přičemž $this->kurzy a $this->datumy jsou názvy tabulek. Jinak struktura obou tabulek je následující:
Kurzy – sloupce id, nazev
Datumy – sloupce id, id_kurzu, popisek, datum

A jak jsem psal výše, potřeboval bych vytáhnout všechny kurzy a ke každému z nich datumy, ve které se koná (k jednomu kurzu je vždy 0 – x datumů).

Díky moc!

před 10 lety

vlki
Člen | 218

Hm, budeš potřebovat agregační funkce, abys získal všechny datumy a ne jen jeden.

$courses = dibi::select('[c].*, GROUP_CONCAT([d.popisek] SEPARATOR \', \') AS [datumy]')
               ->from($this->kurzy)->as('c')
               ->leftJoin($this->datumy)->as('d')
               ->on('[c.id] = [d.id_kurzu]')
               ->groupBy('[c.id]');

Netestováno, ale mělo by vrátit jako sloupec datumy řetězec obsahující všechny popisky datumů oddělené čárkou a mezerou.