Calcolare il valore massimo

  • Creatore Discussione Creatore Discussione gracito
  • Data di inizio Data di inizio

gracito

Utente Attivo
30 Mag 2010
109
0
0
Ciao a tutti

ho un db con due campi numerici (a, b) come posso calcolare il maggiore e visualizzarlo
nel campo Meglio?


Ecco il codice, scusate ma non mi fuoziona il tag php.

<table width="870" border= "1" align="center">
<br>
<tr>

<td width="50" bgcolor="#E1EBBB"><div align="center"><font color="#000066"><b>ID</b></font></div></td>
<td width="150" bgcolor="#E1EBBB"><div align="center"><font color="#000066"><b>DATA_PROVA</b></font></div></td>
<td width="150" bgcolor="#E1EBBB"><div align="center"><font color="#000066"><b>a</b></font></div></td>
<td width="150" bgcolor="#E1EBBB"><div align="center"><font color="#000066"><b>b</b></font></div></td>
<td width="150" bgcolor="#E1EBBB"><div align="center"><font color="#000066"><b>MEGLIO</b></font></div></td>
</tr>
<?php
$db = mysql_connect("localhost","root","");
mysql_select_db("palestra", $db);



function getQuery($Id,$a,$b) {
$query = "SELECT * FROM test WHERE ";

if (isset($Id) && !empty($Id)) {
$query .= "Id LIKE '$Id' AND ";
}


$query .= "1 = 1";

return $query;
}

$result = mysql_query(getQuery($Id,$a,$b), $db) or die ("Errore: ".mysql_error());

$i = 0;
while($myrow=mysql_fetch_array($result))

{

$bgcolor = ($i % 2 == 0 ? '#e4e4e4' : 'white');
$bgcolor = ($myrow['data_mod'] > $myrow['data_ins'] ? 'green' : $bgcolor);



echo <<<EOF
<tr bgcolor="{$bgcolor}">

<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow[Id]</a></td>
<td>$myrow[Data_prova]</td>
<td>$myrow[a]</td>
<td>$myrow</td>

</tr>

EOF;

$i++;
}


?>

</tr>
</table>
</body>
</html>
 
ciao
potresti provare così

PHP:
<?php
if($myrow['a']>$myrow['b']){//a maggiore di b
	$maggiore="<td>".$myrow['a']."</td><td>&nbsp;</td>";
}elseif($myrow['a']<$myrow['b']){//b maggiore di a
	$maggiore="<td>&nbsp;</td><td>".$myrow['b']."</td>";
}else{// a uguale a b
	$maggiore="<td>".$myrow['a']."</td><td>".$myrow['b']."</td>";
}

echo <<<EOF
<tr bgcolor="{$bgcolor}">
<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow['Id']</a></td>
<td>$myrow['Data_prova']</td>
$maggiore
</tr>
EOF;
//ecc.....
?>
 
ciao

Per semplificare la cosa ho messo solo due colonne a, b in pratica sono 6.
Stavo provando con questa funzione $meglio = max($a,$b); nel mio caso con 6 colonne
sarebbe $meglio = max($a,$b,$c,$d,$e,$f); dovrebbe restituirmi il valore massimo, non riesco a farla fuozionare nella mia applicazione.
Quindi dovrei visualizzare tutte e 6 le colonne e affianco la colonna Meglio, non solo quella meglio.

echo <<<EOF
<tr bgcolor="{$bgcolor}">

<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow[Id]</a></td>
<td>$myrow[Data_prova]</td>
<td>$myrow[a]</td>
<td>$myrow</td>
<td>$myrow[c]</td>
<td>$myrow[d]</td>
<td>$myrow[e]</td>
<td>$myrow[f]</td>
$Meglio??????????

</tr>

EOF;
 
ciao
ecco alcune indicazioni
PHP:
<?php
//se sono numeri interi viene valutato il più alto
$a=7;
$b=1;
$c=18;
$d=22;//valutato il più alto
echo "il valore massimo è ".max($a,$b,$c,$d)."<br>";
//se sono misti interi e stringhe vine preso 33 in quanto zuzzerellone valutato 0
$a=7;
$b="zuzzerellone";
$c=33;//valutato il più alto
$d=22;
echo "il valore massimo è ".max($a,$b,$c,$d)."<br>";
//se sono tutte stringhe viene valutato come massimo il più "alto" alfabeticamente
$a="abaco";
$b="zuzzerellone";//valutato il più alto
$c="pinco pallo";
$d="durlindana";
echo "il valore massimo è ".max($a,$b,$c,$d)."<br>";
?>

ho provato lo script che segue e max() funzia
se i tuoi valori in $myrow['a']..... sono numeri potresti fare così

PHP:
<?php
//simulo con un array il database
$bgcolor="#cccccc";
$myrow=array(1,55,78,33,22,16,33);
//ecc...
$meglio=max($myrow);
$myrow['Data_prova']="26 settembre 2010";
$myrow['Id']="3454676";

echo <<<EOF
<table>
<tr bgcolor="{$bgcolor}">
<td><a href="apri_dettagli.php?ID={$myrow['Id']}">{$myrow['Id']}</a></td>
<td>{$myrow['Data_prova']}</td>
<td>il valore migliore è $meglio</td>
</tr>
</table>
EOF;
//ecc...
?>

l'out dello script è

3454676 26 settembre 2010 il valore migliore è 78

spero che ti servano
 
Ciao

Ho provato prima con il codice sotto e non mi da nessun risultato.

PHP:
$result = mysql_query(getQuery($Id,$a,$b), $db) or die ("Errore: ".mysql_error());

$i = 0;
while($myrow=mysql_fetch_array($result))

{
   $myrow = array($a,$b);
   $meglio = max($myrow);
    $bgcolor = ($i % 2 == 0 ? '#e4e4e4' : 'white');
    $bgcolor = ($myrow['data_mod'] > $myrow['data_ins'] ? 'green' : $bgcolor);
    


echo  <<<EOF
<tr bgcolor="{$bgcolor}">

<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow[Id]</a></td>
<td>$myrow[Data_prova]</td>
<td>$myrow[a]</td>
<td>$myrow[b]</td>
<td>$meglio </td>

</tr>

EOF;

Poi ho provato così e mi compare questo risultato  nella $meglio  = max(4.5,4.45) la funzione max non mi ha restituito il risultato.

 echo  <<<EOF
<tr bgcolor="{$bgcolor}">

<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow[Id]</a></td>
<td>{$myrow[Data_prova]}</td>
<td>$myrow[a]</td>
<td>$myrow[b]</td>
<td>$meglio = max($myrow[a],$myrow[b])</td>

</tr>

EOF;
 
Ultima modifica di un moderatore:
ciao
forse non mi ero spiegato bene
tu hai i campi a,b,c, d.... che sono numerici (vero?)
tu estrai con la tua query tutti i campi
poi

PHP:
<?php
//ecc....
$i = 0;
while($myrow=mysql_fetch_array($result)){
	$m[]=$myrow['a'];//trasformo in array
	$m[]=$myrow['b'];
	$m[]=$myrow['c'];
	//ecc....
	$meglio = max($m);//oppure usi nell'echo direttamente la funzione
    $bgcolor = ($i % 2 == 0 ? '#e4e4e4' : 'white');
    $bgcolor = ($myrow['data_mod'] > $myrow['data_ins'] ? 'green' : $bgcolor);
	//non uso l'EREDOC perchè mi trovo meglio, eventualmente trasformi tu
	echo "<tr bgcolor=$bgcolor>";
	echo "<td><a href=\"apri_dettagli.php?ID=".$myrow['Id']."\">".$myrow['Id']."</a></td>";
	echo "<td>".$myrow['Data_prova']."</td>";
	echo "<td>".$myrow['a']."</td>";
	echo "<td>".$myrow['b']."</td>";
	echo "<td>".$myrow['c']."</td>";
	//ecc.......
	echo "<td>$meglio</td>";
	//oppure
	// echo "<td>".max($m)."</td>";//usando le funzioni in un echo è meglio scrivere "ecc".funzione()."ecc"
	//analogo discorso con gli array
	echo "</tr>";
	$i++;
}
//ecc.....
?>
piccola nota:
se non sei sicuro che nei campi a,b,c... di avere un numero (es hai sbagliato a mettere la virgola al posto del punto)
forse sarebbe bene forzare il campo a numerico
es.
$m[]=0+$myrow['b'];
 
Ciao

Funziona quasi bene, fa il controllo nella seconda riga con il maggiore della prima e così con la terza riga fa il confronto con le due precedenti.
così:

Id data a b Meglio
1 1999-10-10 20 15 20
2 2000-10-10 25 30 30
3 1996-10-09 5 7 30
4 2001-12-18 1 3 30

PHP:
while($myrow=mysql_fetch_array($result)){
      
   $m[]=$myrow['a']; 
   $m[]=$myrow['b'];
   $m[]=$myrow['c']; 
   $m[]=$myrow['d'];
   $m[]=$myrow['e']; 
   $m[]=$myrow['f'];
   
   $meglio = max($m);
   
    $bgcolor = ($i % 2 == 0 ? '#e4e4e4' : 'white');
    $bgcolor = ($myrow['data_mod'] > $myrow['data_ins'] ? 'green' : $bgcolor);
    

echo  <<<EOF
<tr bgcolor="{$bgcolor}">

<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow[Id]</a></td>
<td>$myrow[Cognome]</td>
<td>$myrow[Nome]</td>
<td>$myrow[Data_Prova]</td>
<td>$myrow[Tipo_prova]</td>
<td>$myrow[a]</td>
<td>$myrow[b]</td>
<td>$myrow[c]</td>
<td>$myrow[d]</td>
<td>$myrow[e]</td>
<td>$myrow[f]</td>
<td>$meglio</td>
</tr>

EOF;


 $i++;
 
}
 
ciao
scusa ma ho fatto un "piccolo" errore di logica.
se sai quanti sono i campi interessati metti
$m[0]=$myrow['a'];
$m[1]=$myrow['b'];
$m[2]=$myrow['c'];
$m[3]=$myrow['d'];
$m[4]=$myrow['e'];
$m[5]=$myrow['f'];

oppure subito primo o subito dopo $i++;
unset($m);

l'errore di logica è che al primo giro crea da [0] a [5] al secondo da [6] a[11] ecc... e tutti rimangono in memoria
 
Ultima modifica:
Ciao

C'è un piccolo particolare, ti spiego.
La tabella prove e composta da Id, nome, cognome,Data_prova, tipo_prova, a, b, c, d, e, f.
L'id non è univoco l'atleta compare in tabella più volte perche ha fatto più prove,
le prove sono diverse una salto in lungo una salto in alto una corsa, nella casella tipo_prova sono indicate con i numeri 1 2 3, salto in lungo prova 1, salto in alto 2,
corsa 3. Quindi devo calcolare il massimo per la prova 1 e 2 perchè mi serve la prova migliore, per quanto riguarda la corsa la prova migliore è quella minore.

PHP:
while($myrow=mysql_fetch_array($result)){
      
   $m[0]=$myrow['a']; 
   $m[1]=$myrow['b'];
   $m[2]=$myrow['c']; 
   $m[3]=$myrow['d'];
   $m[4]=$myrow['e']; 
   $m[5]=$myrow['f'];
   
      $bgcolor = ($i % 2 == 0 ? '#e4e4e4' : 'white');
    $bgcolor = ($myrow['data_mod'] > $myrow['data_ins'] ? 'green' : $bgcolor);
    

echo  <<<EOF
<tr bgcolor="{$bgcolor}">

<td><a href="apri_dettagli.php?ID=$myrow[Id]">$myrow[Id]</a></td>
<td>$myrow[Cognome]</td>
<td>$myrow[Nome]</td>
<td>$myrow[Data_Prova]</td>
<td>$myrow[Tipo_Prova]</td>
<td>$myrow[a]</td>
<td>$myrow[b]</td>
<td>$myrow[c]</td>
<td>$myrow[d]</td>
<td>$myrow[e]</td>
<td>$myrow[f]</td>
<td>$meglio</td>
</tr>

EOF;

unset($m); //azzera l'array.

 $i++;
 
}
 
ciao
per quanto riguarda il dato minore puoi provare così

PHP:
if($myrow['tipo_di_prova']=="corsa"){
	$meglio = min($m);
}else{
    	$meglio = max($m);
}
quello che secondo me non è giusto è l'id non univoco, comunque se vuoi terenre vicino i valori dei vari atleti potresti mettere nella querry
ORDER BY cognome, nome...
 
Ciao

Ok funziona. Per quanto riguarda l'id lo sostituisco con la data di nascita visto che ci sono molti omonimi. C'è giusto un piccolo problema nel calcolo del minimo questo perchè in alcuni casi ci sono 3 prove, es. 10,10,11,0,0,0 nei campi d,e,f che non ci sono misure mi mette lo zero e quindi la prova più bassa risulta lo zero. Il campo in mysql è di tipo double e mi mette gli zeri.
Come posso eliminarli?

Grazie
 
ciao
qui il problama è un"problemino" non da poco
se il valore 0 viene messo solo ed esclusivamente per prove non effettuate (e non in altri casi)
potresti provare a fare così


PHP:
$m[0]=$myrow['a'];
if( $myrow['a'] === 0){unset($m[0]);}
$m[1]=$myrow['b'];
if( $myrow['b'] === 0){unset($m[1]);}
$m[2]=$myrow['c'];
if( $myrow['c'] === 0){unset($m[2]);}
$m[3]=$myrow['d'];
if( $myrow['d'] === 0){unset($m[3]);}
$m[4]=$myrow['e'];
if( $myrow['e'] === 0){unset($m[4]);}
$m[5]=$myrow['f'];
if( $myrow['f'] === 0){unset($m[5]);}

in questo modo elimini dalla lista di array $m i valori zero e non vengono usati quindi nella ricerca del minimo. da verificare comunque cosa succede se hai tutti 0
 
Ciao

Funziona

ho giusto sostituito gli === con == in b,c,d,e,f e lasciato === in a.

Grazie
 

Discussioni simili