PDA

View Full Version : asp conteggio dati...


SteR9
02-10-2003, 14:22
ragazzi ho un problema...
ho un database nella quale dovrei contare tutti i dati che si ripetono in una stessa colonna e andare a stampare quanti sono...
mi spiego meglio sto creando un forum e ho una tabella nella quale vengono inserite le risposte.
Ho creato una colonna chiamata IDTopic nella quale inserisco l'id del topic a cui si riferisce la risposta
ora io avrei bisogno di contare quanti IDtopic uguali ci sono e andare a stampare il numero.Ad esempio se ho 4 risposte con idtopic 1 vado a stampare 4 di fianco al titolo del messaggio se ho 7 risposte con idtopic 10 vado a stampare 7 nel di fianco al messaggio con idtopic 10

io l'ho fatto così solo che mi stampa solo il numero di risposte del primo messaggio


dim controllo
dim contatore

contatore = 0
controllo = objrecordset.Fields("IdTopic")
do while Not objRecordset.EOF
if objrecordset.Fields("IdTopic") = controllo then
contatore = contatore + 1
'response.Write(contatore)
end if
objRecordset.MoveNext
loop
response.Write(contatore)

spero di essermi spiegato bene :D

cionci
02-10-2003, 14:40
Scusa...non puoi fare con SQL ?

"SELECT count(*) As conteggio from tabella WHERE IdTopic = " & controllo & ";"


objRecordset("conteggio") contiene il numero di messaggi di quel topic...

matpez
02-10-2003, 17:10
La cosa corretta è quella di cionci....la tua è un processo macchinoso e lento e soprattutto esegui un ciclo che tiene occupato il processore èer molto tempo quando crai una tabella con molti dati.

Quando hai a che fare con un database tutti i calcoli se puoi farli con il linguaggio SQL è motlo ma molto meglio! :)

SteR9
02-10-2003, 17:40
Originariamente inviato da matpez
La cosa corretta è quella di cionci....la tua è un processo macchinoso e lento e soprattutto esegui un ciclo che tiene occupato il processore èer molto tempo quando crai una tabella con molti dati.

Quando hai a che fare con un database tutti i calcoli se puoi farli con il linguaggio SQL è motlo ma molto meglio! :)
ma il problema è che anche se lo faccio così mi stampa sempre solo il numero di risposte del primo topic...io invece vorrei stamparlo di tutti

matpez
02-10-2003, 17:52
Allora prova a fare cosi:

SELECT IdTopic , Count(*) as ciao
FROM Tua_Tabella
GROUP BY IdTopic
ORDER BY IdTopic

SteR9
02-10-2003, 21:34
Originariamente inviato da matpez
Allora prova a fare cosi:

SELECT IdTopic , Count(*) as ciao
FROM Tua_Tabella
GROUP BY IdTopic
ORDER BY IdTopic
ho provato a fare la query in access e funziona ma da asp mi stampa sempre solo il numero di risposte del primo topic...

Set objRecordset = objConnessione.Execute("SELECT IdTopic , Count(*) as Conteggio FROM Risposte GROUP BY IdTopic ORDER BY IdTopic")
response.Write(objRecordset("conteggio"))

come posso fare??

matpez
02-10-2003, 22:42
Mi sembra ovvio che nn la stampi tutta, il recordset si fissa sul primo record (se esiste)....

fai cosi:

Set objRecordset = objConnessione.Execute("SELECT IdTopic , Count(*) as Conteggio FROM Risposte GROUP BY IdTopic ORDER BY IdTopic")

while not objRecordset.EOF
response.write objRecordset("IdTopic") & " ... " & objRecordset("Conteggio") & "<br>"
objRecordset.movenext
wend

SteR9
03-10-2003, 12:57
Originariamente inviato da matpez
Mi sembra ovvio che nn la stampi tutta, il recordset si fissa sul primo record (se esiste)....

fai cosi:

Set objRecordset = objConnessione.Execute("SELECT IdTopic , Count(*) as Conteggio FROM Risposte GROUP BY IdTopic ORDER BY IdTopic")

while not objRecordset.EOF
response.write objRecordset("IdTopic") & " ... " & objRecordset("Conteggio") & "<br>"
objRecordset.movenext
wend
eheh che scemo che sono...cmq funziona grazie!
ciao!

matpez
03-10-2003, 13:30
di nulla :p

SteR9
03-10-2003, 17:09
però ho un problema...allora...

tramite un do while Not objRecordset.EOF vado a stampare la tabella e i titoli di ogni topic....però non so come fare ad andare a stampare anche il contatore,visto che serve un altro while non penso si possano fare 2 while uno dentro l'altro...
come posso risolvere??

matpez
03-10-2003, 18:18
Lo fai in una query sola, fai una SELECT multipla, in questa maniera...guarda per esempio la mia:

SELECT ArcNews.IDNews, TabTipiNews.TipoNews, ArcNews.IDMembro, TabMembri.Nick, TabMembri.Trasferito, ArcNews.Data, ArcNews.Titolo, ArcNews.Testo, (SELECT COUNT(*) FROM ArcNewsReply WHERE ArcNewsReply.IDNews=ArcNews.IDNews) AS NumReply
FROM TabTipiNews
INNER JOIN (TabMembri INNER JOIN ArcNews ON TabMembri.IDMembro = ArcNews.IDMembro) ON TabTipiNews.IDTipoNews = ArcNews.IDTipoNews
ORDER BY ArcNews.Data DESC


Se qlc nn ti chiaro te lo rispiego :p

SteR9
03-10-2003, 18:47
non mi è chiarissimo....io ho fatto così

Set objRecordset = objConnessione.Execute("SELECT *,(SELECT IdTopic , Count(*) as Conteggio FROM Risposte GROUP BY IdTopic ORDER BY IdTopic) FROM NuovoMessaggio")

però mi da un errore...

matpez
03-10-2003, 19:13
Probabilemte ti dirà ch la funzione fa parte di un aggregazione...cmq quello che vedi da me è la stampa delle news ed in più c'è anche il numero di reply fatti....

non è difficile, inanzitutto devi scrivere nella SELECT i nomi che ti interesano e non un *, poi in nella SELECT annidata metti cosa del genere: SELECT COUNT(*) FROM ArcNewsReply WHERE ArcNewsReply.IDNews=ArcNews.IDNews) AS NumReply, dove se noti c'è una where che va a puntare ad ogni singolo record e poi va a contare tutte le risponse di quella news....non è facile da immaginare, pensa che una Query viene formata a righe, per cui quando tu gli dai in pasto una stringa esecutiva, lui comincia a fare un elenco, bene, qui prende tutto quello che ti interessa e poi fai la seconda Select che andarà a fare una where proprio nella riga che ti interessa a te andando a contare i reply....

Prova a crearne una tu, se nn ce la fai passami il database che te la creo io...cosi la prossima volta sai come fare!

ciaoooooooooooooooooo :p

cionci
03-10-2003, 20:13
SELECT Risposte.IdTopic, TitoloTopic, count(*)
FROM Risposte INNER JOIN NuovoMessaggio
GROUP BY Risposte.IDTopic, TitoloTopic;

SteR9
04-10-2003, 13:38
Originariamente inviato da cionci
SELECT Risposte.IdTopic, TitoloTopic, count(*)
FROM Risposte INNER JOIN NuovoMessaggio
GROUP BY Risposte.IDTopic, TitoloTopic;
mi dice Errore di sintassi nella proposizione FROM.

matpez
04-10-2003, 14:04
E sa fai una cosa del genere:

Set objRecordset = objConnessione.Execute("SELECT CAMPI_CHE_TI_INTERESSANO, (SELECT COUNT(*) FROM Risposte WHERE Risposte.IDTopic=Topic.IDTopic) as Conteggio FROM Topic")

SteR9
04-10-2003, 17:51
Originariamente inviato da matpez
E sa fai una cosa del genere:

Set objRecordset = objConnessione.Execute("SELECT CAMPI_CHE_TI_INTERESSANO, (SELECT COUNT(*) FROM Risposte WHERE Risposte.IDTopic=Topic.IDTopic) as Conteggio FROM Topic")
mmm così mi somma tutto non mi fa la somma di quelli uguali..

cionci
04-10-2003, 20:34
Originariamente inviato da SteR9
mi dice Errore di sintassi nella proposizione FROM.
Mi ero scordato un pezzo del JOIN...

SELECT Risposte.IdTopic, TitoloTopic, count(*)
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDTopic
GROUP BY Risposte.IDTopic, TitoloTopic;

SteR9
05-10-2003, 12:02
ho modificato la query così SELECT IDmessaggio,TitoloMessaggio,AutoreMessaggio,DataMessaggio,(SELECT Risposte.IdTopic, count(*) as conteggio FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio GROUP BY Risposte.IDTopic) FROM NuovoMessaggio "

ma mi da questo errore...

È stata scritta una sottoquery che può restituire più campi senza utilizzare la parola riservata EXISTS nella proposizione FROM della query principale. Modificare l'istruzione SELECT nella sottoquery per richiedere soltanto un campo.

ufff ce la farò??! :D

cionci
05-10-2003, 12:42
Originariamente inviato da SteR9
ho modificato la query così SELECT IDmessaggio,TitoloMessaggio,AutoreMessaggio,DataMessaggio,(SELECT Risposte.IdTopic, count(*) as conteggio FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio GROUP BY Risposte.IDTopic) FROM NuovoMessaggio "

Non puoi mettere una select nella lista dei campi di un'altra select !!!

SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, count(*)
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio;

SteR9
05-10-2003, 13:02
Originariamente inviato da cionci
Non puoi mettere una select nella lista dei campi di un'altra select !!!

SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, count(*)
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio;
perfetto!funziona alla grande!
grazie!

cionci
05-10-2003, 13:06
Bene !!! :)

SteR9
05-10-2003, 13:59
Originariamente inviato da cionci
Bene !!! :)
d'oh così mi stampa solo i messaggi che hanno una risposta...

cionci
05-10-2003, 15:58
(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, count(*) As NumMsg
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio)
UNION
(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, 0 As NumMsg FROM NuovoMessaggio LEFT JOIN Risposte ON NuovoMessaggio.IDMessaggio=Risposte.IDTopic
WHERE Risposte.IDTopic IS NULL)
ORDER BY DataMessaggio DESC;

SteR9
05-10-2003, 16:55
Originariamente inviato da cionci
(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, count(*) As NumMsg
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio)
UNION
(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, 0 As NumMsg FROM NuovoMessaggio LEFT JOIN Risposte ON NuovoMessaggio.IDMessaggio=Risposte.IDTopic
WHERE Risposte.IDTopic IS NULL)
ORDER BY DataMessaggio DESC;
perfetto grazie!

cionci
05-10-2003, 17:28
Funziona ?!?!? Bene, sono andato a ruota libera :)

SteR9
05-10-2003, 17:45
Originariamente inviato da cionci
Funziona ?!?!? Bene, sono andato a ruota libera :)
funziona!

se io voglio selezionare più tabelle qual'è la sintassi??

se io faccio SELECT * FROM Tabella1,tabella2) quando faccio un while mi stampa più volte lo stesso recordset...penso che la query su più tabelle nn si faccia così,...

cionci
06-10-2003, 04:12
[INSOMNIA MODE ON] ;)
"SELECT * FROM Tabella1, Tabella2;" è il prodotto scalare...cioè la struttura del risultato è la somma delle strutture ed il contenuto è formato da ogni riga di Tabella1 affiancata ad ogni riga di Tabella2...

Es:

&nbsp;&nbsp;&nbsp;A1 A2 A3
RA1
RA2
RA3
RA4

&nbsp;&nbsp;&nbsp;B1 B2 B3
RB1
RB2
RB3

Risultato:

A1 A2 A3 B1 B2 B3
{RA1, RB1}
{RA1, RB2}
{RA1, RB3}
{RA2, RB1}
{RA2, RB2}
{RA2, RB3}
{RA3, RB1}
{RA3, RB2}
{RA3, RB3}
{RA4, RB1}
{RA4, RB2}
{RA4, RB3}

"SELECT * FROM Tabella1, Tabella2 WHERE A1 = B2;" ad esempio...

Filtra i risultati a partire dal rpodotto scalare e lascia solamente quelli in cui A1 è uguale a B2...equivale all'INNER JOIN:

"SELECT * FROM Tabella1 INNER JOIN Tabella2 ON A1 = B2;"

SteR9
06-10-2003, 13:24
Originariamente inviato da cionci
[INSOMNIA MODE ON] ;)
"SELECT * FROM Tabella1, Tabella2;" è il prodotto scalare...cioè la struttura del risultato è la somma delle strutture ed il contenuto è formato da ogni riga di Tabella1 affiancata ad ogni riga di Tabella2...

Es:

&nbsp;&nbsp;&nbsp;A1 A2 A3
RA1
RA2
RA3
RA4

&nbsp;&nbsp;&nbsp;B1 B2 B3
RB1
RB2
RB3

Risultato:

A1 A2 A3 B1 B2 B3
{RA1, RB1}
{RA1, RB2}
{RA1, RB3}
{RA2, RB1}
{RA2, RB2}
{RA2, RB3}
{RA3, RB1}
{RA3, RB2}
{RA3, RB3}
{RA4, RB1}
{RA4, RB2}
{RA4, RB3}

"SELECT * FROM Tabella1, Tabella2 WHERE A1 = B2;" ad esempio...

Filtra i risultati a partire dal rpodotto scalare e lascia solamente quelli in cui A1 è uguale a B2...equivale all'INNER JOIN:

"SELECT * FROM Tabella1 INNER JOIN Tabella2 ON A1 = B2;"
non mi è ben chiaro ON a1=b2
io ho provato a fare
SELECT * FROM Risposte INNER JOIN Utenti
ma mi da questo errore
Errore di sintassi nella proposizione FROM.

dalla tabella Utenti avrei bisogno di una colonna sola...

Molz
06-10-2003, 13:41
L'inner Join ha bisogno di una condizione, di modo da filtrare i risultati (come diceva cionci).

La sintassi del from con inner join e' la seguente:

FROM tabella1 INNER JOIN tabella2 ON condizione

Nn importa d qante colonne hai bisogno.

Un esempio d condizione è tabella1.nome=tabella2.nome

Così facendo la Join nn produce tutto il prodotto cartesiano ma lo filtra alle sole righe nelle qali il campo nome è uguale nelle 2 tabelle

SteR9
06-10-2003, 13:59
ok ho fatto così
SELECT * FROM Risposte INNER JOIN utenti ON Risposte.Autore = utenti.Username

però quando vado a stampare un dato contenuto nella tabella utenti non me lo stampa...
ah la stampa la vado a fare tramite un while dal quale stampo dei dati contenuti nella tabella Risposte...

Molz
06-10-2003, 14:03
però quando vado a stampare un dato contenuto nella tabella utenti non me lo stampa...
ah la stampa la vado a fare tramite un while dal quale stampo dei dati contenuti nella tabella Risposte...

Nn ho ben capito.
Mi scriveresti il codice e cosa vuoi fare plz?

SteR9
06-10-2003, 16:26
Originariamente inviato da Molz
Nn ho ben capito.
Mi scriveresti il codice e cosa vuoi fare plz?
allora tramite un
do while not objrecordset.EOF
stampo tutti i dati che mi servono dalla tabella Risposte
ora sempre in questo while vorrei andare a stampare dei dati presi dalla tabella utenti...
spero di essere stato chiaro...

cionci
06-10-2003, 18:01
Ci deve essere una connessione logica fra i due dati... Non puoi prendere le due tabelle distinte...

Cosa vuoic ercare con la tua query ?

Molz
07-10-2003, 07:27
allora tramite un
do while not objrecordset.EOF
stampo tutti i dati che mi servono dalla tabella Risposte
ora sempre in questo while vorrei andare a stampare dei dati presi dalla tabella utenti...
spero di essere stato chiaro...

L'inner join t dovrebbe creare un'unica tabella e poi te con

response.write objRecordset("nome_colonna")

nel ciclo while stampi il valore della colonna della tabella ke t pare.

Se mi ricordo bene...

SteR9
07-10-2003, 10:36
ragazzi tutto a posto..avevo sbagliato una cosa e non me ne ero accorto...
grazie!
ciao! :)

SteR9
09-10-2003, 16:34
se voglio estrarre dalla tabella Risposte l'ultimo messaggio come posso fare??o creato la query tramite access ed è questa
SELECT Last(Risposte.DataOra) AS UltimoDiDataOra
FROM Risposte;

ma se la volessi inserire in questa query

(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio,DataMessaggio, count(*) As Conteggio
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio)
UNION (SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, 0 As Conteggio FROM NuovoMessaggio LEFT JOIN Risposte ON NuovoMessaggio.IDMessaggio=Risposte.IDTopic
WHERE Risposte.IDTopic IS NULL)
ORDER BY DataMessaggio DESC;

come si fa??

cionci
09-10-2003, 17:54
(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio,DataMessaggio, count(*) As Conteggio, Last(Risposte.DataOra) As DataUltimoMessaggio
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio)
UNION (SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, 0 As Conteggio, DataMessaggio As DataUltimoMessaggio FROM NuovoMessaggio LEFT JOIN Risposte ON NuovoMessaggio.IDMessaggio=Risposte.IDTopic
WHERE Risposte.IDTopic IS NULL)
ORDER BY DataMessaggio DESC;

SteR9
09-10-2003, 18:17
Originariamente inviato da cionci
(SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio,DataMessaggio, count(*) As Conteggio, Last(Risposte.DataOra) As DataUltimoMessaggio
FROM Risposte INNER JOIN NuovoMessaggio ON Risposte.IDTopic = NuovoMessaggio.IDMessaggio
GROUP BY IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio)
UNION (SELECT IDmessaggio, TitoloMessaggio, AutoreMessaggio, DataMessaggio, 0 As Conteggio, DataMessaggio As DataUltimoMessaggio FROM NuovoMessaggio LEFT JOIN Risposte ON NuovoMessaggio.IDMessaggio=Risposte.IDTopic
WHERE Risposte.IDTopic IS NULL)
ORDER BY DataMessaggio DESC;
ok perfetto...avevo fatto così però nn l'avevo messo nella union...mi potresti spiegare cos'è la UNION??
grazie!

cionci
09-10-2003, 18:37
UNION unisce i risultati di due query aventi stessa struttura...

SteR9
09-10-2003, 18:55
Originariamente inviato da cionci
UNION unisce i risultati di due query aventi stessa struttura...
ah :D che stupido potevo arrivarci da solo :D
grazie!