Foros del Web » Programando para Internet » PHP »

Buscar coincidencias

Estas en el tema de Buscar coincidencias en el foro de PHP en Foros del Web. Hola, tengo un problema de rendimiento al buscar coincidencias. Me explico. Tengo unos proyectos y unos usuarios que pertenecen a los diferentes proyectos. Los proyectos ...
  #1 (permalink)  
Antiguo 10/09/2014, 11:32
 
Fecha de Ingreso: enero-2006
Ubicación: Valencia
Mensajes: 96
Antigüedad: 18 años, 9 meses
Puntos: 1
Buscar coincidencias

Hola,
tengo un problema de rendimiento al buscar coincidencias.
Me explico.
Tengo unos proyectos y unos usuarios que pertenecen a los diferentes proyectos.
Los proyectos y usuarios comparten unas 30 categorías.

Entonces cuando creo un nuevo proyecto quiero buscar gente compatible con ese proyecto y busco de entre todos los usuarios las categorías compatibles y lo ordeno de mayor a menor número de categorías compatibles.

El problema viene que si ya tengo cerca de 2500 usuarios y buscar esas 30 categorías una a una a cada usuario pues son muuuchas consultas, cuando no había tantos usuarios no era un problema de tiempo de ejecución.

De momento lo he hago de la siguiente forma
Listo las categorías del proyecto y voy buscando coincidencias en cada uno de los usuarios y lo guardo en otra tabla.
Claro si tengo 20 categorías para buscar en 2500 usuarios son 50000 búsquedas, y si lo acaba haciendo puede tardar 15 o 30 minutos, cuando directamente no se queda colgado.

¿Habría una forma mas eficiente de hacerlo, sin usar tanto procesador?

Muchas gracias

Última edición por jucuegas; 10/09/2014 a las 11:37
  #2 (permalink)  
Antiguo 10/09/2014, 15:51
 
Fecha de Ingreso: enero-2006
Ubicación: Valencia
Mensajes: 96
Antigüedad: 18 años, 9 meses
Puntos: 1
Respuesta: Buscar coincidencias

Resumo lo que hago, a ver si se entiende.
1.- extraigo las categorias del proyecto
2.- con un for las recorro
3.- busco los usuarios que cumplen con cada categoria
4.- actualizo la tabla paralela de usuario que he creado previamente con el contador de categorias

Código PHP:
// CATEGORIAS  *********************************
$categoria $row_proyecto['categoriasproyecto']; // listado de categorias en un campo, del tipo: id1,id2,id14,id23
$categoriaoferta explode(",",$categoria);        // separo las categorias
for ($j=0;$j<count($categoriaoferta);$j++)         // bucle para recorrer cada categorias sobre los usuarios
{
    
mysql_select_db($database_basedatos$basedatos);
    
// busco todos los usuarios que cumplen con la categoria a buscar
    
$query_usuarios "SELECT * FROM usuarios WHERE categoriasusuario LIKE '%$categoriaoferta[$j]%'";
    
$usuarios mysql_query($query_usuarios$basedatos) or die(mysql_error());
    
$row_usuarios mysql_fetch_assoc($usuarios);

    do {
        
// previamente he metido a todos los usuarios en la tabla tabla_usuarios_categorias
        // y ahora actualizo los usuario que cumplen tienen esa categoria, sumo +1 al contador numerocategorias e introduzco el id de la categoria en idcategorias.
        
$updateSQL "UPDATE tabla_usuarios_categorias SET numerocategorias=numerocategorias+1, idcategorias=CONCAT(idcategorias, '$categoriaoferta[$j],') WHERE idusuario=$usuarios[idusurio]";
        
mysql_select_db($database_basedatos$basedatos);
        
$Result1 mysql_query($updateSQL$basedatos) or die(mysql_error());
        } while (
$row_usuarios mysql_fetch_assoc($usuarios));
        
}    
// fin de for ($j=0;$j<count($categoriaoferta);$j++) 
  #3 (permalink)  
Antiguo 10/09/2014, 18:55
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: Buscar coincidencias

Prueba hacer un JOIN se sql.
(Esto significa que la base de datos (no PHP) hace sus operaciones enlazando varias tablas)
No estoy seguro de que funcione a la primera, porque no me queda clara la estructura de tus datos, pero es la idea:

Código PHP:
Ver original
  1. <?php
  2. $categoria = $row_proyecto['categoriasproyecto'];
  3. $categoriaoferta = explode(",",$categoria);
  4. mysql_select_db($database_basedatos, $basedatos);   //antes del bucle una sola vez
  5.  
  6. foreach($categoriaoferta as $cat){
  7.     $query="
  8. UPDATE tabla_usuarios_categorias AS a
  9. LEFT JOIN usuarios AS b ON a.idusuario = b.idusuario
  10. SET a.numerocategorias=a.numerocategorias+1, a.idcategorias=CONCAT_WS(',', a.idcategorias, '$cat')
  11. WHERE b.categoriasusuario LIKE '%$cat%'";
  12.     mysql_query($query, $basedatos) or die(mysql_error());
  13. }
  14. ?>

Etiquetas: coincidencias, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:12.