Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698

    [SQL] Query con COUNT(*)

    Ho questa tabella:

    codice:
    *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:

    codice:
    *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:

    codice:
    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:

    codice:
    SELECT *,id as cid,
               (SELECT COUNT(*) FROM categoria WHERE categoria.id=cid AND id!=parent) as subcat   
    FROM categoria
    Cosa non va?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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

    codice:
    cat | sottocategorie
    0      2
    dovrebbe essere

    codice:
    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.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    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




Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.