Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/07/2011, 17:30
arrasia
 
Fecha de Ingreso: octubre-2007
Mensajes: 68
Antigüedad: 16 años, 6 meses
Puntos: 6
Problema para hayar coincidencias en una tabla

Hola!! Estoy creando una web de viajes, donde los usuarios pueden votar con puntuaciones numéricas las zonas que ha visitado.

La idea es, aposteriori, intentar crear una formula que pueda buscar "su alma gemela" basándose en las puntuaciones que haya puesto. La idea es compararlas y en base a esas comparaciones darle un % de coincidencia.

He diseñado lo siguiente, basándome en que para comparar, el usuario debe tener como mínimo 30 puntuaciones

Código PHP:
<?
    $sujeto1
=$_GET["usuario"]; //este es el nombre del usuario que busca su alma gemela
    
$resultnick=mysql_query("select count(puntuacion)as total, usernick from puntos_paisaje group by usernick HAVING count(puntuacion) > 30"); //empezamos a sacar los nombres de los demas usuarios que tengan como mínimo 30 puntuaciones
    
while ($rownick=mysql_fetch_array($resultnick))
        {
            
$sujeto2=$rownick["usernick "];
            
$porcentaje=0;
            
$coinciden=0;
            
$result=mysql_query("SELECT usernick , puntuacion,idlugar as idl, (select puntuacion  from puntos_paisaje where idlugar=idl and usernick='$sujeto2') as notal_sujeto2 from puntos_paisaje where usernick='$sujeto1'");

//con esto saco todas las puntuaciones del sujeto 1, y al lado las del sujeto 2
            
while ($row=mysql_fetch_array($result))
                {
                
$puntuacion=$row["puntuacion"];
                    if    (
$row["notal_sujeto2"]<>NULL// pregunto si el sujeto 2 tiene puntuada ese paisaje
                        
{
                        ++
$coinciden//si coincide aumento en 1 el contador de coincidencias
                        
$operador=$row["notal_sujeto2"]-$puntuacionrecto la nota del sujeto 1 con la del sujeto 2
                        
switch($operador)  //compruebo el resultado de la recta 
                           

                           case 
0:$porcentaje=$porcentaje+2; break;  // si es cero es que coinciden la nota, le sumo 2 puntos
                           
case 1:$porcentaje=$porcentaje+1; break;  //si tiene una difrencia de uno le sumo 1 punto
                           
case -1:$porcentaje=$porcentaje+1; break; //si tiene una difrencia de uno le sumo 1 punto
                           
case 2:$porcentaje=$porcentaje+0.5; break;  //si tiene una difrencia de uno entre 2 y 3 punto le sumo 0,5puntos
                           
case -2:$porcentaje=$porcentaje+0.5; break; 
                           case 
3:$porcentaje=$porcentaje+0.5; break; 
                           case -
3:$porcentaje=$porcentaje+0.5; break; 
                           case 
4:$porcentaje=$porcentaje-1; break;  //si hay una difrencia de 4 puntos o mas le recto 1
                           
case -4:$porcentaje=$porcentaje-1; break; 
                           case 
5:$porcentaje=$porcentaje-1; break; 
                           case -
5:$porcentaje=$porcentaje-1; break; 
                           case 
6:$porcentaje=$porcentaje-1; break; 
                           case -
6:$porcentaje=$porcentaje-1; break; 
                           case 
7:$porcentaje=$porcentaje-1; break; 
                           case -
7:$porcentaje=$porcentaje-1; break; 
                           case 
8:$porcentaje=$porcentaje-1; break; 
                           case -
8:$porcentaje=$porcentaje-1; break; 
                           case 
9:$porcentaje=$porcentaje-1; break; 
                           case -
9:$porcentaje=$porcentaje-1; break; 
                           case 
10:$porcentaje=$porcentaje-1; break; 
                           case -
10:$porcentaje=$porcentaje-1; break; 
                            }    
                        }
                
                }
            
$operador=$porcentaje/($coinciden*2)*100//el porcentaje
            
$tabla[$k][0]=$operador// lo guardo en un array el porcentaje de afinidad
            
$tabla[$k][1]=$sujeto2// nombre del sujeto
            
$tabla[$k][2]=$coinciden//coincidencias
            
++$k;
        }
rsort($tabla); //ordeno por el porcentaje de afinidad
$k=0;
while(
$k<20)
    {
    echo 
'<br><br>El usuario'.$tabla[$k][1].' tiene una afinidad de '.$tabla[$k][0].'  (Total de conicidiencias  '.$tabla[$k][2].')';
    ++
$k;
    }
?>


Esto funciona, el problema es que en realizar esta operación tarda aproximadamente 5 minutos, por la cantidad de usuarios y puntuaciones que hay ...


¿podéis echarme una mano en como conseguir que este código sea optimo?

La verdad es que llevo poco tiempo programando, y lo he aprendido de forma autodidacto, con lo que intuyo que habrá muchos fallos que podrían optimizar este tipo de consultas

gracias