View Full Version : asp conteggio dati...
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
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...
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! :)
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
Allora prova a fare cosi:
SELECT IdTopic , Count(*) as ciao
FROM Tua_Tabella
GROUP BY IdTopic
ORDER BY IdTopic
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??
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
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!
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??
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
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...
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
SELECT Risposte.IdTopic, TitoloTopic, count(*)
FROM Risposte INNER JOIN NuovoMessaggio
GROUP BY Risposte.IDTopic, TitoloTopic;
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.
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")
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..
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;
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
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;
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!
Originariamente inviato da cionci
Bene !!! :)
d'oh così mi stampa solo i messaggi che hanno una risposta...
(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;
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!
Funziona ?!?!? Bene, sono andato a ruota libera :)
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ì,...
[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:
A1 A2 A3
RA1
RA2
RA3
RA4
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;"
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:
A1 A2 A3
RA1
RA2
RA3
RA4
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...
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
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...
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?
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...
Ci deve essere una connessione logica fra i due dati... Non puoi prendere le due tabelle distinte...
Cosa vuoic ercare con la tua query ?
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...
ragazzi tutto a posto..avevo sbagliato una cosa e non me ne ero accorto...
grazie!
ciao! :)
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??
(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;
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!
UNION unisce i risultati di due query aventi stessa struttura...
Originariamente inviato da cionci
UNION unisce i risultati di due query aventi stessa struttura...
ah :D che stupido potevo arrivarci da solo :D
grazie!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.