Nejste přihlášen(a)
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.
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 ;-)
Já bych použil ještě GROUP BY na kurzy a pak si ty ztracené datumy vytáhnul přes GROUP_CONCAT :)
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
Asi jsem ho hodil do ledový a hluboký vody, ale v týhle podobě to z databáze dostane v nejpohodlnější podobě :)
To je otázka vkusu, potřeby a aktuálního rozpoložení programátora :-D
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!
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.