News:

Ritornati online con una nuova veste grafica

Menu principale

[HELP][ASP] Controllo "count" in query

Aperto da davidonzo, 20 Maggio 2006, 10:15:51

Discussione precedente - Discussione successiva

davidonzo

Buongiorno a tutti

Avrei da chiedervi una cosa... Ho modificato dblog implementando la moderazione dei commenti (posso decidere di renderlo invisibile...).
Per farlo ho dovuto modificare la struttura del database (il software gira su un semplice db in access) aggiungendo alla tabella commenti il campo "modera".
Se modera = True allora il commento è moderato, e quindi invisibile, altrimenti il commento è visibile.

Fin qui tutto ok! Se non che ho nel file default.asp una query che si occupa di visualizzare gli elementi dell'articolo da presentare in home page, tra i queli c'è il numero dei commenti fin li postati.

La query è la seguente:
SQLArticoli = "SELECT TOP "& Num_Max_Articoli &" Articoli.ID, Articoli.Sezione, Count(Commenti.ID) AS ConteggioID, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast FROM [Commenti] RIGHT JOIN [Articoli] ON Commenti.IDArticolo = Articoli.ID WHERE Articoli.Data <= '"& DataToStr(Date()) &"' AND NOT Articoli.Bozza GROUP BY Articoli.ID, Articoli.Sezione, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast ORDER BY Articoli.Data DESC, Articoli.Ora DESC"

        Set RSArticoli = Server.CreateObject("ADODB.Recordset")

        RSArticoli.Open SQLArticoli, Conn, 1, 3


Noterete che i dati sono presi da due tabelle "Commenti" e "Articoli". Il conteggio dei commenti per articolo avviene con un
Count(Commenti.ID) AS ConteggioID
Sfruttando ovviamente il
GROUP BY Articoli.ID
Di modo che il Count conti le righe di commenti a parità di ID di articolo.

Ora però la tabella commenti ha anche il campo "modera" e vorrei che il count avenisse alle stesse condizioni con l'aggiunta di una condizione che permetta il conteggio dei soli commenti approvati (ovvero dei commenti che abbiano "modera = false").

Come risolvo?  

PS: dblog è open source, potete scaricarlo e leggere tutto il default.asp se avete bisogno di maggior chiarezza
davidonzo - anche detto damionzo, ultimamente definito "ragazzino modniubbione"
Se non abbocca all'amo prova con......."ti stimo tantissimo".......
My Blog
Prima di postare fai una Ricerca :-)

ilSilente

#1
Permettimi di consigliarti un piccolo trucco.

Il campo modera invece di essere booleano mettilo come intero, così che se il commento è approvato il campo vale 1, altrimenti vale 0. Sostituisci
Count(Commenti.ID) AS ConteggioIDconSum(Commenti.ID) AS ConteggioIDe il gioco è fatto.

Magari non sarà una cosa pulitissima ma ti risparmia di usare query complicate

Altro modo sarebbe usare la ridondanza: aggiungere alla tabella Articoli un campo ConteggioCommenti che devi incrementare/decrementare ogni volta che approvi/cancelli un commento.

ilSilente

Pensandoci... non basta aggiungere AND Commenti.Moderaalla clausola WHERE?

davidonzo

Citazione di: ilSilente
Pensandoci... non basta aggiungere AND Commenti.Moderaalla clausola WHERE?
E secondo te non c'avevo provato?

Solo che in quel modo scompaiono dalla home page tutti i post con commenti dove ce n'è almeno uno moderato... (modera = True)

[!--quoteo--][div class=\'quotetop\']QUOTE[/div][div class=\'quotemain\'][!--quotec--]Permettimi di consigliarti un piccolo trucco.

Il campo modera invece di essere booleano mettilo come intero, così che se il commento è approvato il campo vale 1, altrimenti vale 0. Sostituisci

Count(Commenti.ID) AS ConteggioID
con

Sum(Commenti.ID) AS ConteggioID
e il gioco è fatto.

Magari non sarà una cosa pulitissima ma ti risparmia di usare query complicate tongue.gif[/quote]
Questo mi sembra ottimo! Ora lo provo.

[!--quoteo--][div class=\'quotetop\']QUOTE[/div][div class=\'quotemain\'][!--quotec--]Altro modo sarebbe usare la ridondanza: aggiungere alla tabella Articoli un campo ConteggioCommenti che devi incrementare/decrementare ogni volta che approvi/cancelli un commento.[/quote]
Buono pure, ma troppo lavoro per un risultato tanto piccolo...

Thanks
davidonzo - anche detto damionzo, ultimamente definito "ragazzino modniubbione"
Se non abbocca all'amo prova con......."ti stimo tantissimo".......
My Blog
Prima di postare fai una Ricerca :-)

ilSilente

Non posso fare la prova con Access... ma invece di RIGHT JOIN usi OUTER JOIN (o RIGHT OUTER JOIN) e metti WHERE Commenti.Modera ?

davidonzo

     

In rosso e grassetto le modifiche rispetto alla query originare...

[!--quoteo--][div class=\'quotetop\']QUOTE[/div][div class=\'quotemain\'][!--quotec--]      SQLArticoli = "SELECT TOP "& Num_Max_Articoli &" Articoli.ID, Articoli.Sezione, Count(Commenti.modera) AS ConteggioID, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast FROM [Commenti] RIGHT OUTER JOIN [Articoli] ON Commenti.IDArticolo = Articoli.ID WHERE NOT Commenti.modera AND Articoli.Data <= '"& DataToStr(Date()) &"' AND NOT Articoli.Bozza GROUP BY Articoli.ID, Articoli.Sezione, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast ORDER BY Articoli.Data DESC, Articoli.Ora DESC"

      Set RSArticoli = Server.CreateObject("ADODB.Recordset")

      RSArticoli.Open SQLArticoli, Conn, 1, 3[/quote]

Aspetto che mi spieghi il perchè

Tenchiùùùùùùùùù
davidonzo - anche detto damionzo, ultimamente definito "ragazzino modniubbione"
Se non abbocca all'amo prova con......."ti stimo tantissimo".......
My Blog
Prima di postare fai una Ricerca :-)

ilSilente

La cosa strana sarebbe che RIGHT OUTER JOIN e RIGHT JOIN sono sinonimi (a meno di problemi nell'implementazione del DBMS). Per caso hai pure messo Commenti.Modera come intero?

davidonzo

Dopo una lunga ed estenuante sessione di chat con ilSilente, ecco la query definitiva e funzionante (almeno fin ora)

[!--quoteo--][div class=\'quotetop\']QUOTE[/div][div class=\'quotemain\'][!--quotec--]'Cerco gli ultimi N articoli

'Aggiunto tags - davidonzo

      SQLArticoli = "SELECT TOP "& Num_Max_Articoli &" Articoli.ID, Articoli.Sezione, Count(Commenti.modera) AS ConteggioID, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast FROM [Commenti] RIGHT JOIN [Articoli] ON Commenti.IDArticolo = Articoli.ID WHERE (Commenti.modera <> true OR Commenti.modera IS NULL) AND Articoli.Data <= '"& DataToStr(Date()) &"' AND NOT Articoli.Bozza GROUP BY Articoli.ID, Articoli.Sezione, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast ORDER BY Articoli.Data DESC, Articoli.Ora DESC"

      Set RSArticoli = Server.CreateObject("ADODB.Recordset")

      RSArticoli.Open SQLArticoli, Conn, 1, 3[/quote]

Quella precedente non contava i valori Null, per cui faceva "scomparire" gli articoli senza commenti.

Thanks a lot!

E ricorda: LAIF IS NAU!  
davidonzo - anche detto damionzo, ultimamente definito "ragazzino modniubbione"
Se non abbocca all'amo prova con......."ti stimo tantissimo".......
My Blog
Prima di postare fai una Ricerca :-)

lorenzone92

#8
Citazione di: davidonzo
E ricorda: LAIF IS NAU!  
AR IU SCIUAR?
       
RockCiclopedia (wiki - forum), Tutta la storia del rock, scritta da voi ...

davidonzo

Non andava nemmeno in quel modo...
C'era un grave bug: in caso di articolo con presenza di commenti TUTTI moderati questo scompariva dalla home. Problema di valori null con condizione di WHERE non adeguata.
Per evitare la cosa ho dovuto ripensare al tutto passando da un booleano di tipo Si/No ad un campo numerico con valori impostati dal sistema in "1" per i commenti approvati ed in "0" per quelli non approvati. Esattamente come dicevi di fare al secondo post

La nuova query
SQLArticoli = "SELECT TOP "& Num_Max_Articoli &" Articoli.ID, Articoli.Sezione, Sum(Commenti.modera) AS ConteggioID, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast FROM [Commenti] RIGHT JOIN [Articoli] ON Commenti.IDArticolo = Articoli.ID WHERE (Commenti.modera <> -1 OR Commenti.modera IS NULL) AND Articoli.Data <= '"& DataToStr(Date()) &"' AND NOT Articoli.Bozza GROUP BY Articoli.ID, Articoli.Sezione, Articoli.Titolo, Articoli.Autore, Articoli.Data, Articoli.Ora, Articoli.Testo, Articoli.Letture, Articoli.tags, Articoli.Podcast ORDER BY Articoli.Data DESC, Articoli.Ora DESC"
davidonzo - anche detto damionzo, ultimamente definito "ragazzino modniubbione"
Se non abbocca all'amo prova con......."ti stimo tantissimo".......
My Blog
Prima di postare fai una Ricerca :-)