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
 
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
 
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ì
 
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?
 
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'
 
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
 
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
 
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);
 
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è : (
 
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
 
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..
 
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!
 
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:
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
 
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?
 
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
 
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' ");
 
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
 
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
 
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