Count dei valori duplicati in un array ordinato

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
Ciao a tutti!

Sono di nuovo qui a chiedere il vostro aiuto, che finora è stato prezioso!!

Ho un array (ordinato) con una serie di valori duplicati, quello che vorrei fare è eliminare i duplicati e conteggiarli per mese.

Così realizzo l'intestazione della tabella:

PHP:
echo "<table id='tableResult' border='0' width='100%'>";
echo "<tr style='font-family: Tahoma; font-size:2,3px'><td><b>NOME</b></td><td><b>Provincia</b></td><td><b>Categoria</b></td><td><b>AMB</b></td><td><b>SPEC</b></td><td><b>Mese</b></td>";
				
foreach(datediff($_POST['startDate'], $_POST['endDate']) as $mesi){
        echo "<td><b>";
        echo getNameMonth($mesi); # Con questa funzione estraggo i nomi dei mesi selezionati tramite textbox
	echo "</b><td>";
}

...

Qui invece creo l'array con i risultati della query:

PHP:
$queryResult = mssql_query($queryResultStr);
while($rowResult = mssql_fetch_array($queryResult)){
				
	$NomeNew = $rowResult["Nome"];
	$provinciaNew = $rowResult["Provincia"];
	$categoriaNew = $rowResult["Categoria"];
	$ambNew = $rowResult["AMB"];
	$specNew = $rowResult["SPEC"];
	$MeseNew = substr($rowResult["startDate"],8,2);
								
	$arrayResult[] = "<tr style='font-family: Tahoma' class='".str_replace(" ","",$NomeNew)." ".$provinciaNew." ".$categoriaNew." ".str_replace(" ","",str_replace(".","",$ambNew))." ".str_replace(".","",$specNew)."'><td>".$isfNew."</td><td>".$provinciaNew."</td><td>".$categoriaNew."</td><td>".$ambNew."</td><td>".$specNew."</td></tr>"; #Prima della chiusura del TR andrebbero i conteggi per mese

}

...

Vorrei ottenere un risultato del genere:

Nome | Provincia | Categoria | AMB | SPEC | Febbraio | Marzo
MARCO ROSSI NA CAT A AMB B SPEC C 2 3
MARCO ROSSI NA CAT B AMB B SPEC C 5 6
MARCO ROSSI NA CAT C AMB B SPEC C 2 1

Spero di aver reso l'idea! Vi ringrazio in anticipo!!
 
Ultima modifica:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, secondo me se modifichi la query ad hoc puoi farti restituire i dati come ti servono
puoi usare funzioni come GROUP BY e COUNT()
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
Purtroppo nel mio caso vorrei evitare di lavorare sulla query, già ora ho dei tempi di risposta abbastanza alti (10/15 secondi)..... :crying:

Ciao, secondo me se modifichi la query ad hoc puoi farti restituire i dati come ti servono
puoi usare funzioni come GROUP BY e COUNT()
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
allora forse è proprio il caso di rivedere la query
cmq per trovare i valori duplicati prova a prendere spunto da questo codice
http://forum.mrwebmaster.it/php/28352-contare-valori-uguali-array-dividerli-stringa.html#post103500

Purtroppo non so quanto sia possibile sistemare la query, fa una semplice select con 3 where e senza alcun join.. All'interno della tabella ci saranno circa 700 mila record. Provo la soluzione da te suggerita, sembra essere perfetta!

Come al solito ti ringrazio per la tempestività e soprattutto disponibilità! :fonzie:

Provo e ti aggiorno..
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
700mila record? Di solito si evita di avere così tanti record in un'unica tab a meno che non sia proprio necessario perché appunto rallenta l'esecuzione delle query.
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
Purtroppo il db non posso toccarlo perchè se ne occupa un'altro ragazzo, quindi ho poche alternative.
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Hai provato a cambiare la query?
Poi confronta i tempi di risposta.
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
Hai provato a cambiare la query?
Poi confronta i tempi di risposta.

Più semplice di così non saprei farla:

select Nome, Provincia, Categoria, AMB, SPEC, startDate from vtlcontattiriep where userIdLogIn = '".$DM."' and startDate between '".$start."' and '".$end."' ORDER BY Nome, Provincia, Categoria, AMB, SPEC
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
forse dovresti dire al tuo collega di mettere qualche indice sulla tabella
la query è semplicissima l'ho provata simile su una mia tabella che ha oltre 1 milione di record
Codice:
SELECT idLog, desc, log, idProdotto, fornitore
FROM `log`
WHERE data
BETWEEN "2012-01-01"
AND "2013-03-27"
Codice:
Mostrando i righi 0 - 29 ( 1,128,389 totale, La query ha impiegato 0.0020 sec)

edit
in effetti se li mostro tutti ci impiega 8 secondi
ma li cerchi sempre tutti?
 
Ultima modifica:

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
C'è da dire che poi fai n! (Male che ti vada) confront per vedere se è ordinato no?
Non ho visto il codice che fa il controllo per i duplicati.
Sei riuscito a fare qualcosa con il link del thread postato da criric?
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
forse dovresti dire al tuo collega di mettere qualche indice sulla tabella
la query è semplicissima l'ho provata simile su una mia tabella che ha oltre 1 milione di record
Codice:
SELECT idLog, desc, log, idProdotto, fornitore
FROM `log`
WHERE data
BETWEEN "2012-01-01"
AND "2013-03-27"
Codice:
Mostrando i righi 0 - 29 ( 1,128,389 totale, La query ha impiegato 0.0020 sec)

edit
in effetti se li mostro tutti ci impiega 8 secondi
ma li cerchi sempre tutti?

No no, non sempre, ma in alcuni casi si.

Lasciamo stare il collega, è meglio! E' di una disponibilità unica, per non parlare della tantissima voglia di fare! :incazz:

Comunque teoricamente pensavo ad una soluzione del genere:

- Creare un array utilizzando la funzione array_unique;
- Cercare per ogni record le corrispondenze nell'array nativo e contarle, (creando record differenti in base al mese) ed inserirle conteggiate in un nuovo array (come potrei farlo questo?);
- Cercare per ogni record le corrispondenze nell'array nativo, fare una substr estaendo il conteggio per mese e fare un merge su un'unica stringa.

Secondo voi è fattibile??

Grazie mille.
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
È una possibile soluzione.
Io ho pensato a qualcosa che ti fa risparmiare tempo visto che ci vuol già molto per caricare la query.
PHP:
$elem_ripetuti = array_unique(array_diff_assoc($tuo_array,array_unique($tuo_array)));
In questo modo $elem_ripetuti contiene tutti e solo gli elementi ripetuti 2 o più volte quindi ti basta contare questi e tutti gli altri sono ripetuti una sola volta.
Ora che hai questi elementi li confronti con quelli dell'array originario per vedere quante volte sono ripetuti.
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
È una possibile soluzione.
Io ho pensato a qualcosa che ti fa risparmiare tempo visto che ci vuol già molto per caricare la query.
PHP:
$elem_ripetuti = array_unique(array_diff_assoc($tuo_array,array_unique($tuo_array)));
In questo modo $elem_ripetuti contiene tutti e solo gli elementi ripetuti 2 o più volte quindi ti basta contare questi e tutti gli altri sono ripetuti una sola volta.
Ora che hai questi elementi li confronti con quelli dell'array originario per vedere quante volte sono ripetuti.

Allora, partendo dal tuo suggerimento ho cambiato la query (impiega circa 2 secondi in più, quindi mi può star bene):

PHP:
$queryResultStr = "select Nome, Provincia, Categoria, AMB, SPEC, MONTH(startDate) as Mese, COUNT(MONTH(startDate)) as Totale from vtlcontattiriep where userIdLogIn = '".$DM."' and startDate between '" . $starty . "-" . $startm . "-" . $startd ." 00:00:00' and '" . $endy . "-" . $endm . "-" . $endd ." 23:59:59' GROUP BY Nome, Provincia, Categoria, AMB, SPEC, MONTH(startDate) ORDER BY Nome, Provincia, Categoria, AMB, SPEC";

Chiaramente così, il risultato sarà un record per ogni mese, quindi:

Nome Provincia Categoria AMB SPEC Mese Totale
Carlo NA cat_A amb_A spec_B 1 3
Carlo NA cat_A amb_A spec_B 2 6


Mentre quello che vorrei ottenere io è:

Nome Provincia Categoria AMB SPEC Gennaio Febbraio Totale
Carlo NA cat_A amb_A spec_B 3 6 9



Suggerimenti????? :dipser:
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Be' lo potevi dire prima. Come ti aveva già suggerito criric utilizzando il Group BY e count() puoi ottenere tutto già dalla query senza manipolare con php.
 

carlo9987

Utente Attivo
5 Mar 2013
35
0
0
Roma
Be' lo potevi dire prima. Come ti aveva già suggerito criric utilizzando il Group BY e count() puoi ottenere tutto già dalla query senza manipolare con php.

Si scusatemi!! Il discorso è che di regola non dovrei toccare le query perchè dovrebbe fornirmele un collega in base ai tempi di risposta, però in questo caso ragionandoci è un suicidio, quindi gliene ho parlato e l'abbiamo cambiata...
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Dovresti utilizzare qualcosa del tipo:
Codice:
SUM(IF(month = "gennaio", 1,0)) AS `gennaio`,
SUM(IF(vote = "febbraio", 1,0)) AS `febbraio`,
...
 
Discussioni simili
Autore Titolo Forum Risposte Data
alankanz Count che ricomincia ogni anno PHP 2
M Estrarre valore con SELECT COUNT PHP 0
L [RISOLTO] Stampa a video risultato count in html PHP 13
L [PHP] problema count messo in una funzione. PHP 1
R [MySQL] Join, Count e Order (ASC & DESC)... MySQL 6
K MySQL DISTINCT e COUNT insieme MySQL 1
G [risolto] MySql, SELECT, GROUP BY e COUNT MySQL 6
F select count php ajax Ajax 12
F [Risolto] Count Classic ASP 6
A Count Inner Join e stampa record con id non duplicati PHP 1
Monital Select count in array PHP 23
L Count(array) mi restituisce sempre 1 PHP 8
A RecordCount e Select Count Classic ASP 2
D count e suddivisione conteggi PHP 2
L Column count doesn't match value ..... Classic ASP 2
C select count PHP 2
G Count down Flash 0
Z Count Down HTML e CSS 1
T come ordinare dei record recuperati da due tabelle MySQL 0
C Creare Tabella Dati Meteo prelevandoli da dei Tags in un altro foglio PHP 27
C prendere dei valori da Plugin e inserirli nel database joomla Joomla 0
otto9due Impedire esecuzione diretta dei file PHP 7
seranto Blocco preventivo e Registro dei Consensi per Cookie tecnici? Leggi, Normative e Fisco 2
F Scrivere dei dati in word con php PHP 0
M Problemi con la stampa dei valori in php PHP 1
L Ricezione dei dati su file php da modulo html PHP 6
G Somma dei Minuti PHP 3
W Elenco dei link del file presenti in una cartella PHP 2
C Esclusione dei giorni festivi Javascript 0
W Evitare ridondanza dei dati Classic ASP 3
I Passare dei parametri in javascript PHP 0
G Scelta dei Breakpoint HTML e CSS 1
D Javascript per il download dei dati Javascript 0
G MariaDB non restituisce dei valori PHP 7
J estrarre url dei file video da youtube "get_video_info" PHP 6
MarcoGrazia [PHP] Uso dei namespace PHP 5
B [PHP] recuperare IP dei server in load balancing [RISOLTO] PHP 3
W [WordPress] [WooCommerce] Non trovo più la Tab Visulizzazione dei Prodotti in questo nuovo Plugin WordPress 2
L Trasferimento dei file OLM Mac in formato PST sul sistema Mac Mac e Software 1
W [Javascript] Bootstrap Admin templates, mi dareste dei consigli? CMS (Content Management System) 0
maxnegri Sommare i prezzi dei prodotti aggiunti al carrello di diverse aziende con Select sum php mysqli PHP 10
spider81man [PHP] Pulsante SUBMIT per download diretto dei file PHP 9
C Creazione di una funzione per il filtraggio dei campi di un db Presentati al Forum 0
A [PHP] Generare nomi dei file con lettere minuscole e vocali senza accenti PHP 2
S Visibilità dei like dei propri amici su Facebook Social Media Marketing 2
G [HTML] Modificare ordine dei div in mobile responsive HTML e CSS 5
elpirata [PHP][RISOLTO] Effettuare la somma dei tempi di lavorazione PHP 3
MarcoGrazia [PHP] Percorso dei file PHP 3
M New entry nel mondo dei DB Presentati al Forum 1
M [PHP] Aggiornare i dati dei record selezionati PHP 3

Discussioni simili