Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda con Optimización de consultas

Estas en el tema de Ayuda con Optimización de consultas en el foro de Mysql en Foros del Web. Hola, estoy desarrollando un sistema multinivel y quisiera saber como optimizar las consultas de la red de un usuario. Supongamos que tengo la siguiente red: ...
  #1 (permalink)  
Antiguo 12/03/2010, 16:06
Avatar de cemansilla  
Fecha de Ingreso: septiembre-2007
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 214
Antigüedad: 16 años, 6 meses
Puntos: 6
Pregunta Ayuda con Optimización de consultas

Hola, estoy desarrollando un sistema multinivel y quisiera saber como optimizar las consultas de la red de un usuario.

Supongamos que tengo la siguiente red:



Donde 2 y 3 son referidos directos de 1, o sea que conforman el 1º nivel de su red. A su vez 4 es referido de 2, por lo que 4 pertenece al primer nivel de la red de 2 y al segundo nivel de la red de 1. Y asi sucesivamente.

Mi consulta es como almacenar los datos para que la consulta a base para armar la red de una persona sea óptima, creo que lo ideal es traer todos los datos en 1 sola consulta pero no se me ocurre como hacerlo.

La idea es que me quede todo almacenado de la siguiente manera:
  • 1
    • 2
      • 4
        • 8
        • 9
      • 5
    • 3
      • 6
      • 7

Como última aclaración les digo que la cantidad de niveles de la red es un número variable, en principio son 3 niveles pero podrian ser más o menos. Y la cantidad de personas por nivel también varia.

Espero se entienda y me puedan tirar una mano.
__________________
CÉSAR MANSILLA
Web & Mobile Developer - Analista - Creativo - Curioso
http://cesarmansilla.com/
http://cesarmansilla.com/blog/
  #2 (permalink)  
Antiguo 12/03/2010, 16:15
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 17 años, 10 meses
Puntos: 50
Respuesta: Ayuda con Optimización de consultas

Lo que se me ocurre

es ir guardando los datos en una tabla con dos campos campos

i_usuario, i_padre
2-----1
3-----1
4-----2
6-----3
5-----2
7-----3

si quiere saber la red del usuario dos le tocaria crearse uan funcion recursiva creo yo
Priemro buscaria los usuarios cuyo padre sea dos.
luego de cada uno de esos usuarios busco el hijo
los imprimo
de cada hijo busco su hijo " y asi sigue armando el arbol mientras tenga hijos"
los imprimo

para eso tendira que recibir el id de usuario como parametro de la funcione y dentro del while llame a la misma funcion madandole el id del usuario actual.

Espero me entienda y le sirva. Culquier duda me avis apara colaborarle.. Si lo va a hacer en php aun mejor porque es el lenguaje que manejo para arientarlo
  #3 (permalink)  
Antiguo 12/03/2010, 16:21
Avatar de cemansilla  
Fecha de Ingreso: septiembre-2007
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 214
Antigüedad: 16 años, 6 meses
Puntos: 6
Respuesta: Ayuda con Optimización de consultas

Cita:
Iniciado por helacer Ver Mensaje
Lo que se me ocurre

es ir guardando los datos en una tabla con dos campos campos

i_usuario, i_padre
2-----1
3-----1
4-----2
6-----3
5-----2
7-----3

si quiere saber la red del usuario dos le tocaria crearse uan funcion recursiva creo yo
Priemro buscaria los usuarios cuyo padre sea dos.
luego de cada uno de esos usuarios busco el hijo
los imprimo
de cada hijo busco su hijo " y asi sigue armando el arbol mientras tenga hijos"
los imprimo

para eso tendira que recibir el id de usuario como parametro de la funcione y dentro del while llame a la misma funcion madandole el id del usuario actual.

Espero me entienda y le sirva. Culquier duda me avis apara colaborarle.. Si lo va a hacer en php aun mejor porque es el lenguaje que manejo para arientarlo
Si entiendo y es como lo encaré como primera instancia pero tendria que hacer una consulta por cada miembro de la red. Siguiendo el ejemplo que puse tendría 9 consultas a base para armar 1 sola red.

La idea es que el proyecto tenga mucha gente y al no existir limite por nivell, si el ususrio 1 por ejemplo invitara a 100 personas al sistema tendria 101 consultas.

Por eso puse de titulo que busco ayuda con optimización de consultas, quiero encontrar la forma más optima y creo que hay que encontrarle la vuelta por el lado de MySQL.

Saludos y gracias!
__________________
CÉSAR MANSILLA
Web & Mobile Developer - Analista - Creativo - Curioso
http://cesarmansilla.com/
http://cesarmansilla.com/blog/
  #4 (permalink)  
Antiguo 12/03/2010, 16:27
 
Fecha de Ingreso: mayo-2006
Ubicación: Bogotá
Mensajes: 2.061
Antigüedad: 17 años, 10 meses
Puntos: 50
Respuesta: Ayuda con Optimización de consultas

con una sola consulta no va apoder hacerlo estoy casi seguro, yson consultas simples que con una funcion co nautollamado bien elaborada no van a gastar mucho tiempo ni recursos de la maquina. Igual si llega decidirse por esta opci´no cualquier cos me avis si necesita ayuda o sino espermos haber si hay alguna forma de hcerl ocomo dice que no creo
  #5 (permalink)  
Antiguo 12/03/2010, 17:19
Avatar de cemansilla  
Fecha de Ingreso: septiembre-2007
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 214
Antigüedad: 16 años, 6 meses
Puntos: 6
Respuesta: Ayuda con Optimización de consultas

Encontré este articulo: http://dev.mysql.com/tech-resources/...ical-data.html

Y basado en el generé la consulta de la siguiente manera:

Código PHP:
function getRedReferidos($id_usuario){
         
         
$db = new db();
         
         
$query_join "";
         
         
$query "SELECT ";         
         
         for(
$c 2$c <= NIVELES$c++){
             
             
$coma = ($c != NIVELES) ? "," "";
             
             
$query .= ($c 1) . " AS nivel, t" $c ".id, t" $c ".nombre, t" $c ".apellido, t" $c ".estado, t" $c ".patrocinador, t" $c ".email" $coma;
        
             
$query_join .= " LEFT JOIN `usuarios` AS t" $c " ON t" $c ".patrocinador = t" . ($c 1) . ".id ";
             
         }
         
         
$query .= " FROM `usuarios` AS t1 ";
         
         
$query .= $query_join;

        
$query .= " WHERE t1.id = '" $id_usuario "';";
         
         echo 
$query;
         
     } 
Lo que me genera esta consulta (con datos ficticios):

Código:
SELECT 1 AS nivel, t2.id, t2.nombre, t2.apellido, t2.estado, t2.patrocinador, t2.email, 2 AS nivel, t3.id, t3.nombre, t3.apellido, t3.estado, t3.patrocinador, t3.email FROM `usuarios` AS t1 LEFT JOIN `usuarios` AS t2 ON t2.patrocinador = t1.id LEFT JOIN `usuarios` AS t3 ON t3.patrocinador = t2.id WHERE t1.id = '1';
Y este es el resultado:



Con estos datos en la tabla de usuarios:



Y esta perfecto el tema es que estoy trayendo datos de mas por cada registro, o al menos podria cambiar un poco la generacion d ela consulta para organizar todo un poco mas.

EDITO y AGREGO: lo que necesitaria es 1 registro por cada usuario y que indique el nivel al que pertenece
__________________
CÉSAR MANSILLA
Web & Mobile Developer - Analista - Creativo - Curioso
http://cesarmansilla.com/
http://cesarmansilla.com/blog/

Última edición por cemansilla; 12/03/2010 a las 17:29

Etiquetas: optimización
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 20:09.