Oznámení
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.