Oznámení
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;
}
?>