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"]-$puntuacion; recto 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