Contare record in tabella secondo certe condizioni

anthares

Nuovo Utente
8 Gen 2012
26
0
0
Ciao sto provando a cercare una funzione che mi permetta di contare il numero di record che si ripetono in una tabella secondo certe condizioni.. mi spiego meglio riportando un'immagine del mio database:

1.JPG

In questa tabella di nome PN_USER_EXTENDED ho i vari utenti con il numero di partite giocate nel campo user_npart.. tale valore dipende dal conteggio di record nella tabella PN_PARTITA_UTENTI così come riportata nell'immagine:

3.JPG

Vorrei una query di questo tipo che mi vada a contare quante volte un utente è presente in tabella..

PHP:
$query = "SELECT count(*) as num_partite_giocate FROM PN_PARTITA_UTENTI where user_stato='P' ";

solo che questa query non è completa.. ho bisogno di una dritta raga
 

metalgemini

Utente Attivo
14 Apr 2004
745
0
0
Ciao sto provando a cercare una funzione che mi permetta di contare il numero di record che si ripetono in una tabella secondo certe condizioni.. mi spiego meglio riportando un'immagine del mio database:

Vedi l'allegato 1082

In questa tabella di nome PN_USER_EXTENDED ho i vari utenti con il numero di partite giocate nel campo user_npart.. tale valore dipende dal conteggio di record nella tabella PN_PARTITA_UTENTI così come riportata nell'immagine:

Vedi l'allegato 1083

Vorrei una query di questo tipo che mi vada a contare quante volte un utente è presente in tabella..

PHP:
$query = "SELECT count(*) as num_partite_giocate FROM PN_PARTITA_UTENTI where user_stato='P' ";

solo che questa query non è completa.. ho bisogno di una dritta raga

Prova con:
PHP:
"SELECT COUNT(*) FROM PN_PARTITA_UTENTI WHERE username = 'ciccio' AND user_stato='P'";

In teoria prelevi e conti solo i record dell'utente CICCIO
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
se non ho capito male tu vuoi contare quante volte l'utente "pinco" è presente nella tabella PN_PARTITA_UTENTI e una volta contato vuoi aggiornare il campo user_npart della tabella PN_USER_EXTENDED relativamente all'utente "pinco", è così?
domanda: hai anche una tabella utenti (se si come si chiama la tabella e il campo con l'username)? o i nomi degli utenti sono solo nella tabella PN_USER_EXTENDED
fammi sapere se è così
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
Ciao ragazzi, grazie per l'aiuto.. metalgemini tale soluzione va bene solo se ho pochi record.. borgo italia hai capito alla perfezione cosa vorrei fare, però no, non ho una tabella per gli utenti. esiste secondo te un modo per fare il calcolo per tutti gli utenti in una sola botta?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
puoi provare così
PHP:
<?php
//....
//dati di connessione
$q_1=mysql_query("SELECT username FROM PN_USER_EXTENDED");
while($riga_1=mysql_fetch_array($q_1)){
	$utente=$riga_1['username'];
	$q_2=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P'");
	$quanti=mysql_num_rows($q_2);
	//$q_3 aggiorna il numero di partite di pinco solo se il numero di partite (di pinco) è variato
	$q_3=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$quanti' WHERE username='$utente' AND user_npart !='$quanti'");
}
//...
?>
se non funzia prova a togliere in $q_3 AND user_npart !='$quanti'
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Forse non ho capito

PHP:
SELECT sum(user_npart) as somma_partite, username
       FROM PN_USER_EXTENDED 
       GROUP BY username

In questo modo dovresti riuscire a sommare tutte le partite raggruppate per utente

non sono sicuro della sintassi
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
o se devi unire le tabelle


PHP:
SELECT sum(U.user_npart) as somma_partite, U.username
       FROM PN_USER_EXTENDED U
       JOIN PN_PARTITA_UTENTI P ON P.user_id = U.user_id
       WHERE P.user_stato = 'P'
       GROUP BY U.username
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
ciao
puoi provare così
PHP:
<?php
//....
//dati di connessione
$q_1=mysql_query("SELECT username FROM PN_USER_EXTENDED");
while($riga_1=mysql_fetch_array($q_1)){
	$utente=$riga_1['username'];
	$q_2=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P'");
	$quanti=mysql_num_rows($q_2);
	//$q_3 aggiorna il numero di partite di pinco solo se il numero di partite (di pinco) è variato
	$q_3=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$quanti' WHERE username='$utente' AND user_npart !='$quanti'");
}
//...
?>
se non funzia prova a togliere in $q_3 AND user_npart !='$quanti'

mi da questo errore
Codice:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /membri/volleynapoli/sito/php_volleynapoli/pnbp_classmens.php on line 28

e alla linea 28 ho
PHP:
$quanti=mysql_num_rows($q_2);
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
Forse non ho capito

PHP:
SELECT sum(user_npart) as somma_partite, username
       FROM PN_USER_EXTENDED 
       GROUP BY username

In questo modo dovresti riuscire a sommare tutte le partite raggruppate per utente

non sono sicuro della sintassi

no criric non devo sommare il numero di partite ma devo trovare il valore di user_npart dato dal numero di record username che si ripetono in una tabella secondo delle condizioni. borgo italia si è avvicinato alla soluzione però mi da errore, non so perchè : (
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
la query di criric mi sembra giusta (anche se non ho capito male ha invertito il nome della tabella), puoi provare a semplificare in

PHP:
<?php
//...........
$q_1=mysql_query("SELECT sum(user_npart) as somma_partite, username FROM PN_PARTITA_UTENTI GROUP BY username");
while($riga=mysql_fetch_assoc($q_1)){
	$utente=$riga['username'];
	$quanti=$riga['somma_partite'];
	$q_3=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$quanti' WHERE username='$utente' AND user_npart !='$quanti'"); 
}
//.........
?>
comunque l'unica è provare
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
mi da questo errore
Codice:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /membri/volleynapoli/sito/php_volleynapoli/pnbp_classmens.php on line 28

e alla linea 28 ho
PHP:
$quanti=mysql_num_rows($q_2);

Non mi esce più l'errore, avevo sbagliato a scrivere una variabile. però ancora non funge, non cambia i valori nel database..
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
ciao
puoi provare così
PHP:
<?php
//....
//dati di connessione
$q_1=mysql_query("SELECT username FROM PN_USER_EXTENDED");
while($riga_1=mysql_fetch_array($q_1)){
	$utente=$riga_1['username'];
	$q_2=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P'");
	$quanti=mysql_num_rows($q_2);
	//$q_3 aggiorna il numero di partite di pinco solo se il numero di partite (di pinco) è variato
	$q_3=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$quanti' WHERE username='$utente' AND user_npart !='$quanti'");
}
//...
?>
se non funzia prova a togliere in $q_3 AND user_npart !='$quanti'

Funzionaa! grazieee.. appena ho eliminato AND user_npart !='$quanti'.. sei davvero grande!
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
una domanda.. e se volessi riportare la somma di valori presenti in alcuni campi? di certo il mysql_num_rows non va bene..cosa devo usare secondo voi? riporto il codice.. in giallo le parti che ho provato ad aggiungere al codice di borgo italia per eseguire questa somma di set vinti e set persi, sempre per ogni utente e da riportare nella tabella PN_USER_EXTENDED.

PHP:
$q_1=mysql_query("SELECT username FROM PN_USER_EXTENDED"); 
while($riga_1=mysql_fetch_array($q_1)){ 
    $utente=$riga_1['username']; 
	
    $q_2=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita > $anno_partite AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti"); 
	$q_3=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita LIKE '$data_classifica%' AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti"); 
	
	//$q_4=mysql_query("SELECT sum(set_vinti) as num_setv FROM PN_PARTITA_UTENTI WHERE username='$utente' "); 
	//$q_5=mysql_query("SELECT sum(set_persi) as num_setp FROM PN_PARTITA_UTENTI WHERE username='$utente' ");
	
    $conta_partite=mysql_num_rows($q_2); 
	$conta_partite_mese=mysql_num_rows($q_3);
	//$conta_setv=mysql_num_rows($q_4);
	//$conta_setp=mysql_num_rows($q_5);
	
    $q_6=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$conta_partite' WHERE username='$utente' "); 
	//$q_6=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$conta_partite' AND user_setv = '$conta_setv' AND user_setp = '$conta_setp' WHERE username='$utente' ");
	$q_7=mysql_query("UPDATE PN_CLASSIFICA_MENS SET user_npart='$conta_partite_mese' WHERE username='$utente' "); 
}
 
Ultima modifica:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
provo a metterti una possibile soluzione, però poi se devi fare l'update devi farlo fuori dal ciclo whilw e farne un altro.
ti ho solo messo la visualizzazione dei risultati, l'uppaggio eventualmente a te l'onere
PHP:
<?php
//.....
$perse_tot=array();
$vinte_tot=array();
$perse_mese=array();
$vinte_mese=array();

$q_1=mysql_query("SELECT username FROM PN_USER_EXTENDED"); 
while($riga_1=mysql_fetch_array($q_1)){ 
    $utente=$riga_1['username']; 
    $q_2=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita > $anno_partite AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti"); 
    $q_3=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita LIKE '$data_classifica%' AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti"); 
    $conta_partite=mysql_num_rows($q_2); 
    $conta_partite_mese=mysql_num_rows($q_3);
    $q_6=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$conta_partite' WHERE username='$utente' "); 
    $q_7=mysql_query("UPDATE PN_CLASSIFICA_MENS SET user_npart='$conta_partite_mese' WHERE username='$utente' ");
	//parte di calcolo delle vinte perse totali e mese
	$riga_pt=mysql_fetch_assoc($q_2);
	$perse_tot[$utente] += $riga_pt['set_persi'];
	$vinte_tot[$utente] += $riga_pt['set_vinti'];
	$riga_pm=mysql_fetch_assoc($q_3);
	$perse_mese[$utente] += $riga_pm['set_persi'];
	$vinte_mese[$utente] += $riga_pm['set_vinti'];
} 
//qui ti metto la visualizzazione dei risultati, poi se devi uppare qualcosa prova a pensarci tu
foreach($perse_tot as $ut => $part){//qualsiasi array che cicli puo andare bene
	if(($perse_tot[$ut]+$vinte_tot[$ut]) == 0){
		echo "l'utente $ut non ha giocato partite";
	}else{
		echo "l'utente $ut giocato ".($perse_tot[$ut]+$vinte_tot[$ut])." partite, di cui ".$vinte_tot[$ut]."vinte e ".$perse_tot[$ut]." perse<br>";
		if(($perse_mese[$ut]+$vinte_mese[$ut]) == 0){
			echo "l'utente $ut non ha giocato partite in questo mese";
		}else{
			echo "in questo mese l'utente $ut giocato ".($perse_mese[$ut]+$vinte_mese[$ut])." partite, di cui ".$vinte_mese[$ut]."vinte e ".$perse_mese[$ut]." perse<br>";
		}
	}
}
//.....
?>
provalo al massimo non funzia
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
non funziona.. porta valori diversi, e penso perchè non esegue la somma dei valori presenti nelle celle ma la somma delle righe.
Mi spiego meglio: nella tabella PN_PARTITA_UTENTI ho la colonna set_vinti e set_persi di ogni partita per ogni giocatore, per esempio alla partita del 10 gennaio il giocatore pinco ha fatto 3 set vinti e 2 set persi, il giorno 25 gennaio lo stesso giocatore ha fatto 1 set vinti e 4 persi.. vorrei sommare questi valori e riportarli nella tabella PN_USER_EXTENDED dove è presente il campo user_setv e user_setp, dove uscirà rispettivamente 3+1=4 e 2+4=6. Poi allo stesso modo, cambiando le condizioni, sommo i set v. e p. di ogni mese, sempre per ogni giocatore, e lo porto nella tabella della classifica mensile. Pensi che ci vuole un select sum?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
hai ragione non funzia ho fatto un GROSSO errore di logica:crying:
al primo giro (prendo un solo fetch) mettamo che utente sia pinco
$riga_pt=mysql_fetch_assoc($q_2); legge il primo record della tabella che soddisfa le condizioni della query
quando ritrova (ai giri successivi) la condizione pinco, non legge l'altro record di pinco, ma sempre il primo che trova.
se hai pazienza ci penso un momentono anche se credo che col sum vada bene, però probabilmente (ci devo pensare) ci vuole un altro ciclo while
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
ciao
hai ragione non funzia ho fatto un GROSSO errore di logica:crying:
al primo giro (prendo un solo fetch) mettamo che utente sia pinco
$riga_pt=mysql_fetch_assoc($q_2); legge il primo record della tabella che soddisfa le condizioni della query
quando ritrova (ai giri successivi) la condizione pinco, non legge l'altro record di pinco, ma sempre il primo che trova.
se hai pazienza ci penso un momentono anche se credo che col sum vada bene, però probabilmente (ci devo pensare) ci vuole un altro ciclo while

Sto provando a utilizzare il sum, con ciclo while non saprei come fare.. se lo scrivessi così?

PHP:
$query = "SELECT sum(set_vinti) as num_setv FROM PN_PARTITA_UTENTI where username = '$utente' ";
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);

$user_setv = $row['num_setv'];

mysql_query("UPDATE PN_USER_EXTENDED SET user_setv = $user_setv WHERE username = '$utente' ");
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
ciao
ti avevo postato una possibile soluzione, ma è sparita ????? o ho postato per errore da qualche altra parte o non so (tra ll'altro ho cancellato l'originale), se hai pazienza provo a rifarla e riposto, comunque pensavo anch'io col sum
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
148
63
PR
www.borgo-italia.it
cioa
ripescato, ma non giuro che funzi.
comunque verifica i nomi delle variabili e dei campi nan so se li ho messi giusti
PHP:
<?php 
//..... 
$q_1=mysql_query("SELECT username FROM PN_USER_EXTENDED");  
while($riga_1=mysql_fetch_array($q_1)){  
    $utente=$riga_1['username'];  
    $q_2=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita > $anno_partite AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti");  
    $q_3=mysql_query("SELECT * FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita LIKE '$data_classifica%' AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti");  
    $conta_partite=mysql_num_rows($q_2);  
    $conta_partite_mese=mysql_num_rows($q_3);
	//questa e la parte con sum ***********
	$q_4=mysql_query("SELECT SUM(set_persi) as spt,  SUM(set_vinti) as svt FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita > $anno_partite AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti");
	$riga_t=mysql_fetch_assoc($q_4);
	$set_pt=$riga_t['spt'];//dovrebbe risultare quanti set ha perso $utente in totale
	$set_vt=$riga_t['svt'];//dovrebbe risultare quanti set ha vinto $utente in totale
	$q_5=mysql_query("SELECT SUM(set_persi) as spm,  SUM(set_vinti) as svm FROM PN_PARTITA_UTENTI WHERE username='$utente' AND user_stato='P' AND id_partita LIKE '$data_classifica%' AND stato_partita = 'AT' AND user_prior <= $numero_partecipanti");
	$riga_m=mysql_fetch_assoc($q_m);
	$set_pm=$riga_t['spm'];//dovrebbe risultare quanti set ha perso $utente nel mese
	$set_vm=$riga_t['svm'];//dovrebbe risultare quanti set ha vinto $utente nel mese
	/*
	qui prima di uppare (commenta le query di uppaggio $q_6 e $q_7) ti conviene mettere degli echo per visualizzare i risultati
	un'altra piccola verifica:
	la somma di $set_pt con $set_vt dovrebbe essere uguale a $conta_partite (salvo che non ci sia la possibilità di pareggio)
	analogo per il dato mensile
	*/
	//qui aggiorno il tutto
    $q_6=mysql_query("UPDATE PN_USER_EXTENDED SET user_npart='$conta_partite', user_setv = '$set_vt', user_setp = '$set_pt' WHERE username='$utente' ");  
    $q_7=mysql_query("UPDATE PN_CLASSIFICA_MENS SET user_npart='$conta_partite_mese', user_setv = '$set_vm', user_setp = '$set_pm'  WHERE username='$utente' "); 
}  
//..... 
?>
fammi sapere

p.s.
comunque questa volta l'ho salvato
 

anthares

Nuovo Utente
8 Gen 2012
26
0
0
All'inizio ha dato errore, poi ho visto che c'erano due piccoli errori..

PHP:
$riga_m=mysql_fetch_assoc($q_m); 
    $set_pm=$riga_t['spm'];//dovrebbe risultare quanti set ha perso $utente nel mese

$q_m deve essere $q_5 e $riga_t deve essere $riga_m

Ma risolto questo il sistema gira benissimo. Ottimo borgo italia, ci hai visto giusto fin dall'inizio e grazie a te ho imparato anche qualcosa in più.
 
Discussioni simili
Autore Titolo Forum Risposte Data
zorro [PHP] Contare i record di una tabella PHP 6
nim contare record uguali in tabella PHP 10
L contare record uguali in file csv PHP 3
C Contare numero record uguali Database 3
G [ACCESS2007]: contare li ultimi record con lo stesso valore in un campo, finchè il valore non cambia MS Access 2
M contare record db con valore specifico PHP 1
A Contare gli elementi di un array PHP 13
maxnegri Contare sessioni aperte e creare condizione PHP 1
B [MySQL] contare quante un oggetto e' presente MySQL 2
elpirata [RISOLTO][Mysql] Contare le occorrenze in un campo tipo varchar MySQL 2
P [PHP] Contare quante volte uno stesso id si ripete nella tabella PHP 12
P [PHP] Contare i mesi con timestamp. PHP 8
A Contare n° totale oggetti da mysql PHP 5
asevenx [Javascript] [AngularJS] contare opzioni selezionate di una select in un elenco ng-repeat Javascript 0
xone [PHP] Contare numero dei giorni tra data_in e data_out PHP 11
F Contare le righe con php ad oggetti MySQL 0
asevenx Contare numero di righe in un form dinamico Javascript 5
F Miglior metodo per contare le righe di una query MySQL 2
S Contare valori uguali in una colonna PHP 2
N Contare post MySQL 2
L contare nodi figli di un determinato nodo madre XML 0
H Contare file presenti nella pagina PHP 3
S [RISOLTO]php contare numero delle query PHP 1
L Contare determinati valori che si ripetono in una tabella per un detemrinato ID MySQL 2
Monital Contare il numero di righe con php5 PHP 10
Shyson Contare i caratteri user e dominio Javascript 57
D Contare numero div con una determinata classe Javascript 2
criric Contare le settimane di un mese Snippet PHP 3
Monital Contare valori uguali di un array e dividerli in una stringa PHP 12
nim contare frasi che si ripetono PHP 10
R Contare il numero di click su un link PHP 2
A contare iniziali dei nomi Java 3
G contare e sommare dopo JOIN Database 8
M non contare gli accessi dal tuo pc Supporto Mr.Webmaster 1
S Come contare i Download file .zip su html HTML e CSS 10
S Selezionare ultimo record di una sotto query MySQL 0
A Tabella con bottoni per aggiornamento record PHP 6
S Differenza date record successivi MS Access 7
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
S Aggiornamento lista record Database 2
M Esportazione in CSV, salta il primo record PHP 4
T foreach e fetchAll dove recupero solo l'ultimo record PHP 5
A Raggruppare record con stessa data PHP 13
R Scorporare array e recuperare record tabella PHP 10
Tommy03 Select in ordine per numero di record MySQL 7
L Creazione di 2 o più record PHP 6
mazman mysqli_query() mi ritorna un array vuoto anche se presente un record nella tabella PHP 13
M Estrapolare singoli record da intervallo (dal al/inizio fine) MS Access 0
max1974 [MySQL] Estrapolare record finti/inisistenti MySQL 9
G [PHP] Passare dati tra record PHP 4

Discussioni simili