tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

SELECT COUNT a JOIN jak na to?

před 10 lety

mardon
Člen | 59

mám dvě tabulky category (id, name) a service(id, id_cat,…)

<?php
public function get_all_cat (){
        $res = dibi::query('
            SELECT [id], [name]
            FROM [category]
        ');

        return $res;
    }

?>

my vypíše všechny kategorie, chtěla bych ale k SELECTU přidat i počet service, které se nachází v dané kategorii (tj. v tabulce service je id_cat id kategorie) mám tam něco takového , ale to není správně

<?php
 public function get_all_cat (){
        $res = dibi::query('
            SELECT [cat].[id], [cat].[name]
            COUNT [service].[id_cat] AS [num]
            FROM [category] as [cat]
            JOIN [service] ON [cat.id]=[service.id_cat]
            GROUP BY [cat].[id]
        ');

        return $res;
    }
?>

před 10 lety

phx
Člen | 652

COUNT() a ne COUNT …

Tz:

$res = dibi::query('
            SELECT [cat].[id], [cat].[name]
            COUNT([service].[id_cat]) AS [num]
            FROM [category] as [cat]
            JOIN [service] ON [cat.id]=[service.id_cat]
            GROUP BY [cat].[id]
        ');

Osobne bych to zapsal takto. [] je nutne jen kdyz jde o klicove slovo. a AS lze u tabulek vynechat. Pokud mas definovy FK lze pouzit USING().

$res = dibi::query('
            SELECT C.id, C.name
            COUNT(S.id_cat) AS num
            FROM category C
            JOIN service S ON USING(id_cat)
            GROUP BY C.id
        ');

před 10 lety

mardon
Člen | 59

phx napsal(a):

COUNT() a ne COUNT …

Tz:

$res = dibi::query('
            SELECT [cat].[id], [cat].[name]
            COUNT([service].[id_cat]) AS [num]
            FROM [category] as [cat]
            JOIN [service] ON [cat.id]=[service.id_cat]
            GROUP BY [cat].[id]
        ');

Osobne bych to zapsal takto. [] je nutne jen kdyz jde o klicove slovo. a AS lze u tabulek vynechat. Pokud mas definovy FK lze pouzit USING().

$res = dibi::query('
            SELECT C.id, C.name
            COUNT(S.id_cat) AS num
            FROM category C
            JOIN service S ON USING(id_cat)
            GROUP BY C.id
        ');

Díky vyzkouším, to s [] jsem netušila, jsem víceméně samouk tak se v tom plácám

před 10 lety

phx
Člen | 652

Spravne se v MySQL pisou zpetne apostrofy ``. Jen Dibi umoznuje pouzivat i [] coz je zase prevzato z MsSQL. Osobne se to lepe pise na klavesnici pAlt + F|G nez pAlt + 7 a mezernik.

před 10 lety

mardon
Člen | 59

takže výše uvedené mi nefungovala ale nakonec jsem si pomohla takto:

<?php
public function get_all_cat (){
        $res = dibi::query('
            SELECT cat.id,cat.name,
            COUNT(ser.id_cat) AS num
            FROM category AS cat
            INNER JOIN service AS ser
            ON ser.id_cat = cat.id
            WHERE ser.visible=1
            GROUP BY [cat.id]
');
?>

což funguje, ale mám další problém, že do výběru nejsou zahrnuty kategori, které nemají žádnou service, což bych ovšem samozřejmě chtěla (sloupec visible mi určuje zda je zveřejněnq nebo není

před 10 lety

vlki
Člen | 218

Toho dosáhneš použitím vnějšího spojení (OUTER JOIN). Konkrétní, které potřebuješ je LEFT JOIN, který vybere i kategorie, které nemají žádné service.

Takovým tápáním ale nebudeš moci využít všech výhod, které ti relační databáze poskytuje.

Doporučuji přečíst třeba i jen stránku o JOINech na Wikipedii – https://en.wikipedia.org/wiki/Join_(SQL)

Pěkný článek s tipy pro SQL developery vyšel nedávno i na Nettuts. V části Understand joins je to pěkně nastíněno. http://net.tutsplus.com/…-developers/ Lehké povědomí o možnostech SQL ale vyžaduje.

Editoval vlki (9. 6. 2009 20:30)

před 10 lety

mardon
Člen | 59

ano už mi to funguje

<?php
    public function get_all_cat (){
        $res = dibi::query('
            SELECT cat.id,cat.name,
            COUNT(ser.id_cat) AS num
            FROM category AS cat
            LEFT JOIN service AS ser
            ON ser.id_cat = cat.id
            WHERE ser.visible=1 OR ser.visible IS NULL
            GROUP BY [cat.id]
            ');

        return $res;
    }
?>