PDA

Visualizza la versione completa : [SQL] Query con COUNT(*)


Gil Mour
17-03-2009, 16:30
Ho questa tabella:




*Categoria
id_cat | id_parent |name



id_cat è la chiave primaria, id_parent una FK verso la tabella Categoria stessa.

Con questa struttura rappresento una gerarchia di categorie dove ognuna di esse ha un link alla categoria padre; solo le categorie di livello piu alto hanno id_parent = id_cat.

Ora devo fare una query che mi restituisca, per ogni categoria, il numero di sottocategorie contenute.

Esempio:

Ho questa tabella:




*Categoria
id_cat | id_parent |name
0 0 Root
1 0 Saponi
2 1 Shampoo
3 1 Saponedimarsiglia
4 0 Animale
5 4 Pecora
6 4 Capra



Da queste entry vorrei che fosse prodotto un risultato di questo tipo:




cat | sottocategorie
0 2
1 2
2 0
3 0
4 2
5 0
6 0



Mi sembra una cosa molto banale ma forse ho bevuto troppa birra ultimamente e mi sono incaprettato su questa query:



SELECT *,id as cid,
(SELECT COUNT(*) FROM categoria WHERE categoria.id=cid AND id!=parent) as subcat
FROM categoria


Cosa non va?

YuYevon
17-03-2009, 18:18
Guarda ci sono alcune cose strane.

Innanzitutto, nella tua query specifichi questo campi in SELECT:

id

ma id nella tabella non esiste... al massimo sarà id_cat, no?

Tra l'altro, se nella clausola SELECT metti il simbolo * che seleziona tutti i campi della tabella (o dellE tabelle joinate) a cosa ti serve poi specificare anche un altro attributo? Non è già "incluso" in * ?

In ogni caso la query è errata perché sempre nella clausola SELECT specifichi una query, ma una query restituisce un valore ( o più valori ), non un "campo" (= dominio).

Un'altra cosa: l'oggetto "Root" è sottocategoria di sé stesso? Dalla lettura dei dati si direbbe di sì visto che hai specificato come id_parenti di quell'oggetto 0, che è il suo stesso identificativo. Se anche vuoi fare così, allora l'output che vorresti ottenere non è quello che hai scritto tu, o per meglio dire più precisamente la riga



cat | sottocategorie
0 2


dovrebbe essere



cat | sottocategorie
0 3


considerando appunto che l'oggetto '0' ha 3 sottocategorie (4, 5 e sé stesso).

In ogni caso, la query potrebbe essere più o meno così:

SELECT cat1.id_cat, count(*)
FROM categorie cat1 JOIN categorie cat2 ON cat1.id_cat = cat2.id_parent
GROUP BY cat1.id_cat;

Anche se così facendo otterresti i il numero delle sottocategorie per ciascuna categoria solo quando questo è diverso da 0.

Gil Mour
17-03-2009, 18:27
Sulle cose strane..hai ragione. I campi errati della select sono cosi perchè, per semplificare la lettura, ho rinominato alcuni campi e tabelle e mi sono dimenticato di riallineare il tutto.

Specificare i campi da selezionare dopo * lo faccio sui campi che ho bisogno di rinominare (forse in questo caso non è necessario)

Per il terzo punto..la query non è errata. Se restituisce un solo valore e viene associata ad un alias, una query può essere annidata e rappresentare un campo della tabella risultato.

Comunque ora ho staccato tutto..stasera provo il tuo suggerimento e ti faccio sapere.
Grazie :)



:ciauz:

Loading