- Home
- Categorie
- Coding e Sistemistica
- PHP
- Creazione Graduatoria
-
Creazione Graduatoria
Ciao a tutti, devo creare le "Graduatorie" dei migliori tempi per ogni gara in base a ciò che vuole vedere l'utente...
Qui potete vedere le relazioni del DB: http://www.lucandre.com/scambio/relazioniGraduatorie.pdf
Io fin'ora ho utilizzato questo codice:
[PHP]
<?php
$sql="SELECT codFinAtl,nome,cognome,YEAR(dataNascita) AS annoNascita, MIN(tempoRisultato) AS tempoRisultato, dataManifestazioneIn, sedeManifestazione, graduatorie.crono FROM manifestazionigrad INNER JOIN (anagrafica INNER JOIN graduatorie ON codFin=codFinAtl) ON manifestazionigrad.idManifestazione=graduatorie.codMan WHERE anagrafica.eliminato='n' AND graduatorie.eliminato='n' AND codGara='".$sub_gara."' AND sesso='".$_POST['sesso']."' AND manifestazionigrad.aa='".$ANNOAG."' AND graduatorie.baseVasca='".$_POST['cod_tipovasca']."'";
if($nomeCat=="Seniores")
$sql.=" AND YEAR(dataNascita)<='".$sub_anno."'";
else{
if($sub_anno==($anni[1]."-".$anni[2]."-".$anni[3]))
$sql.=" AND (YEAR(dataNascita)='".$anni[1]."' OR YEAR(dataNascita)='".$anni[2]."' OR YEAR(dataNascita)='".$anni[3]."')";
else{
if($sub_anno!=($anni[1]."-".$anni[2]))
$sql.=" AND YEAR(dataNascita)='".$sub_anno."'";
elseif($sub_anno==($anni[1]."-".$anni[2]))
$sql.=" AND (YEAR(dataNascita)='".$anni[1]."' OR YEAR(dataNascita)='".$anni[2]."')";
}
}
$sql.=" GROUP BY codFinAtl ORDER BY tempoRisultato, cognome, nome";
$ris=@mysql_query($sql);
// echo $sql;
if(mysql_num_rows($ris)>=1){
?>
<table class="tborder" width="100%" cellspacing="1" cellpadding="6" border="0" align="center">
<tr>
<td class="thead" width="10">Pos.</td>
<td class="thead" width="200">Atleta</td>
<td class="thead" width="40">Anno</td>
<td class="thead" width="60">Tempo</td>
<td class="thead" width="240">Conseguimento</td>
</tr>
<?
$i=1;
while($riga=mysql_fetch_array($ris)){
$cognome=strtoupper($riga['cognome']);
$nome=ucwords($riga['nome']);
$anno=$riga['annoNascita'];
$codFinAtl=$riga['codFinAtl'];
$sql2="SELECT tempoRisultato, dataManifestazioneIn, sedeManifestazione, graduatorie.crono FROM manifestazionigrad INNER JOIN graduatorie ON manifestazionigrad.idManifestazione=graduatorie.codMan WHERE graduatorie.eliminato='n' AND codGara='".$sub_gara."' AND manifestazionigrad.aa='".$ANNOAG."' AND graduatorie.baseVasca='".$_POST['cod_tipovasca']."' AND codFinAtl='".$codFinAtl."' ORDER BY tempoRisultato LIMIT 1";
$ris2=@mysql_query($sql2);
$riga1=mysql_fetch_array($ris2);
$sede=strtoupper($riga1['sedeManifestazione']);
$crono=$riga1['crono'];
$tempo=$riga1['tempoRisultato'];
$annoD=substr($riga1['dataManifestazioneIn'],0,4);
$meseD=substr($riga1['dataManifestazioneIn'],5,2);
$giornoD=substr($riga1['dataManifestazioneIn'],8,2);
$data=$giornoD."/".$meseD."/".$annoD;
if($crono=="M"){
if($_POST['cod_tipovasca']==25)
$tempo=$tempo + 20;
elseif($_POST['cod_tipovasca']==50)
$tempo=$tempo + 40;
}elseif($crono=="A"){
$tempo=$tempo;
}
$tempo=str_pad($tempo,6,'0',STR_PAD_LEFT);
$tempoVis=(substr($tempo,0,2))."'".(substr($tempo,2,2)).".".(substr($tempo,4,2));
//$data_fn=$giorno_fn."/".$mese_fn."/".$anno_fn;//ControlloSocietàSiciliana $annoAtleta=substr($ANNOAG,0,4); $sqlSoc="SELECT codSoc FROM rel_atl_soc WHERE aa='".$annoAtleta."' AND codFin='".$codFinAtl."' AND tipoTess='PR'"; $risSoc=@mysql_query($sqlSoc); if(mysql_num_rows($risSoc)<1){ $sqlSoc="SELECT codSoc FROM rel_atl_soc WHERE aa='".$annoAtleta."' AND codFin='".$codFinAtl."' AND tipoTess='TE'"; $risSoc=@mysql_query($sqlSoc); } $rigaSoc=mysql_fetch_array($risSoc); $codSoc=$rigaSoc['codSoc']; if(substr($codSoc,0,3)!="SIC") continue; ?>
[/PHP]
E' sempre andato tutto bene, ma ora improvvisamente l'estrapolazione dei dati è diventato sempre più lento e la maggior parte delle volte il DB va in Time Out non riuscendo a completare il caricamento della pagina.
Nelle relazioni che vedete, i campi "codFin", "codFinAtl", "codManifestazione", "codSoc", sono campi UNIVOCI...
Mi aiutate a risolvere il problema per favore?
-
Ciao talkoman,
hai inserito in tutte le tabelle gli indici?
Di quanti dati stiamo parlando?
-
Si, gli indici sono presenti in ogni tabella....beh, i dati da estrarre sono parecchi....
-
Parecchi quanto? Serve un dato oggettivo...
-
Beh i dati da estrarre, che alla fine sono visibili non sono quasi mai più di 100....ma nella tabella Anagrafica deve cercare tra 60.524 dati, e nella tabella "rel_atl_soc" ci sono 84.436 dati...
-
Nessun suggerimento?
-
I numeri vi hanno fatto paura?
-
Le query non sono molto complesse, e nemmeno il numero di dati mi sembra molto elevato da giustificare questo problema.
Intanto ti dire di fare un explain della query, inoltre se puoi posta la struttura vista con phpmyadmin delle tabelle interessate, perchè l'utilizzo degli indici non mi convince.
-
@Thedarkita said:
...Intanto ti dire di fare un explain della query, inoltre se puoi posta la struttura vista con phpmyadmin delle tabelle interessate, perchè l'utilizzo degli indici non mi convince.
Come si fa?
-
Aggiungi EXPLAIN EXTENDED all'inizio della query e la lanci da phpmyadmin.
-
Ecco il risultato:
Risultato SQL Host: ******* Database: ******* Generato il: 14 apr, 2011 at 01:25 PM Generato da: phpMyAdmin 3.2.0.1 / MySQL 5.0.91-enterprise-gpl-log query SQL: EXPLAIN EXTENDED SELECT codFinAtl,nome,cognome,YEAR(dataNascita) AS annoNascita, MIN(tempoRisultato) AS tempoRisultato, dataManifestazioneIn, sedeManifestazione, graduatorie.crono FROM manifestazionigrad INNER JOIN (anagrafica INNER JOIN graduatorie ON codFin=codFinAtl) ON manifestazionigrad.codice=graduatorie.codMan WHERE anagrafica.eliminato='n' AND graduatorie.eliminato='n' AND codGara='01' AND sesso='M' AND manifestazionigrad.aa='2010/11' AND graduatorie.baseVasca='25' AND (YEAR(dataNascita)='1991' OR YEAR(dataNascita)='1992') GROUP BY codFinAtl ORDER BY tempoRisultato, cognome, nome; Righe: 3 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE manifestazionigrad ALL NULL NULL NULL NULL 129 Using where; Using temporary; Using filesort 1 SIMPLE graduatorie ALL NULL NULL NULL NULL 56788 Using where 1 SIMPLE anagrafica ALL NULL NULL NULL NULL 60493 Using where