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

bucle con mysql?

Estas en el tema de bucle con mysql? en el foro de Mysql en Foros del Web. buenas. tengo las siguientes tablas Código: tabla usuarios: id login pass referido tabla compras id id_login nombre_login y necesito hacer una consulta para obtener el ...
  #1 (permalink)  
Antiguo 28/03/2009, 17:00
Avatar de dannce4life  
Fecha de Ingreso: junio-2008
Ubicación: localhost
Mensajes: 137
Antigüedad: 15 años, 9 meses
Puntos: 6
Mensaje bucle con mysql?

buenas.

tengo las siguientes tablas

Código:
tabla usuarios:
id
login
pass
referido

tabla compras
id
id_login
nombre_login
y necesito hacer una consulta para obtener el numero de compras de cada usuario referido. a esas cantidades, sumarlas todas para crear un total.

se me ocurre que se podria hacer con un bucle, pero no conozco muy bien el lenguaje.

espero se entienda.
desde ya, muchas gracias
  #2 (permalink)  
Antiguo 28/03/2009, 17:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: bucle con mysql?

Cuando se trata de consultas, existen recursos más poderosos en SQL que un bucle.
Piensa que el SQL es un lenguaje de consultas, por lo que está optimizado precisamente para ese tipo de tareas.

En las tablas que planteas no existen precios, ni valores de compras, solamente los ID que no resultan muy claros a qué se refieren. Como una forma estandarizada de mnemotécnica te sugiero que no uses un nombre tan genérico como "ID" para todas las tablas. És mejor usar el "ID como sufijo del nombre de campo, algo así como "USUARIO_ID" y "COMPRA_ID" (los DBA usan habitualmente esto así). Esto luego te facilitará la escritura de las consultas, te lo aseguro.

Bien. Suponiendo estas tablas:
Cita:
USUARIO(usuario_id, login, pass, referido)
COMPRA(compras_id, usuario_id, nombre_login)
Para saber cuántas compras tiene cada usuario, sería:
Código sql:
Ver original
  1. SELECT usuario_id, COUNT(*)  compras_totales
  2. FROM usuario LEFT JOIN compra USING(usuario_id)
  3. GROUP BY usuario_id;

Podría usar INNER JOIN en lugar de LEFT JOIN, pero eso no te devolvería los usuarios con cero compras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/03/2009, 15:27
Avatar de dannce4life  
Fecha de Ingreso: junio-2008
Ubicación: localhost
Mensajes: 137
Antigüedad: 15 años, 9 meses
Puntos: 6
Respuesta: bucle con mysql?

Estimado gnzsoloyo:

Primero y principal, gracias por responder a mi pregunta.

Las tablas originales son:

USUARIOS(usuario_id, nombres, apellidos, nacimiento, pais, provincia, email, login, clave, ip, referido)
COMPRAS(compra_id, usuario_id, login, producto, fecha_compra, ip)

No existen precios, porque lo que me interesa saber,
es la cantidad de compras que se efectuaron entre todos los usuarios referidos.

El código planteado funciona, pero con esto solo se logra el primer objetivo.
A continuación explico en un diagrama las metas a lograr:



Como vemos en la imagen 1, se va pasando de consultas generales hasta el objetivo final.
Tu respuesta engloba la parte mas general del diagrama.
Dejo lo siguiente a modo de ejemplo:

1) en esta parte se hace un recuento de las compras
de todos los usuarios y sus respectivos referidos.

2) me interesa, por ejemplo, todos los referidos de "Juan"
entonces los filtro

3) en esta etapa, ya filtrados los usuarios, obtengo
el numero de compras totales de los referidos de Juan.

Espero que con esto se haya comprendido mejor la idea.
  #4 (permalink)  
Antiguo 29/03/2009, 15:46
 
Fecha de Ingreso: octubre-2008
Mensajes: 387
Antigüedad: 15 años, 5 meses
Puntos: 18
Respuesta: bucle con mysql?

SELECT COUNT(*)
FROM compras a, usuario b
WHERE a.usuario_id = b.referido
AND b.referido = "juan"
  #5 (permalink)  
Antiguo 29/03/2009, 15:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: bucle con mysql?

En esencia el problema es simple. El tema se resuelve exactamente como lo planteas, pero en el area de SQL la lógica graficada se representa exactamente al reves: La selección "gruesa" es la interna y los datos buscados están en el exterior.
Me explico:
Se trata de una consulta a tres niveles, lo que vulgarmente se denomina "consulta anidadas" y se hace realizando las etapas de a una desde la más gruesa a la mas fina (interior-> exterior).
Lo importante es lo siguiente: Cada consulta crea una tabla virtual en memoria, por lo que para que un dato que se usa en la externa exista, debe ser derivado a ella desde la interna. Esto significa que el campo "referido" debe ser parte de la consulta más gruesa, aunque en esa consulta no signifique nada.
Esto sería:
Código sql:
Ver original
  1. SELECT usuario_id, referido, COUNT(*)  compras
  2. FROM usuario LEFT JOIN compra USING(usuario_id)
  3. GROUP BY usuario_id;

Sabemos que esto genera una sumatoria de las compras realizadas por cada usuario. Si lo que deseamos es la suma total de compras por referidos, pero con subtotales, debemos hacer una subconsulta:
Código sql:
Ver original
  1. SELECT referido, usuario_id, nombres, apellidos,  SUM(compras) TotalCompras
  2. FROM
  3.     (SELECT usuario_id, referido,nombres, apellidos,  COUNT(*)  compras
  4.     FROM usuario LEFT JOIN compra USING(usuario_id)
  5.     GROUP BY usuario_id) t1
  6. GROUP BY referido WITH ROLLUP;

Esto debe devolver la suma parcial de cada uno, además de una línea con el total. Si le quitas el WITH ROLLUP, solamente te devolverá el valor de la suma total, pero para eso tines otra consulta, que hace todo:
Código sql:
Ver original
  1. SELECT usuario_id, referido, COUNT(*)  compras
  2. FROM usuario LEFT JOIN compra USING(usuario_id)
  3. GROUP BY referido;

Nota que con sólo cambiar el campo de agrupamiento tienes la suma que necesitas... sin más trámite.

Si cambias LEFT JOIN por INNER JOIN, te devolverá solamente los usuarios que hayan sido referidos por alguien. COmo por ejemplo, todos los referidos a "juan", pero no las compras hechas por "juan", si juan no tiene un referido.

Aquí lo único que debes establecer es el nivel de desagregación que necesitas obtener.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 29/03/2009, 15:55
Avatar de dannce4life  
Fecha de Ingreso: junio-2008
Ubicación: localhost
Mensajes: 137
Antigüedad: 15 años, 9 meses
Puntos: 6
Respuesta: bucle con mysql?

Cita:
Iniciado por denica001 Ver Mensaje
SELECT COUNT(*)
FROM compras a, usuario b
WHERE a.usuario_id = b.referido
AND b.referido = "juan"
eso no me sirve denica, lo que busco, es la SUMA DE COMPRAS DE TODOS LOS USUARIOS REFERIDOS DE "JUAN".

la consulta que me has dado, solamente me dice cuantos referidos tiene juan.
Fijate en la imagen 2 para que comprendas.
  #7 (permalink)  
Antiguo 29/03/2009, 17:58
Avatar de dannce4life  
Fecha de Ingreso: junio-2008
Ubicación: localhost
Mensajes: 137
Antigüedad: 15 años, 9 meses
Puntos: 6
Respuesta: bucle con mysql?

gnzsoloyo, aprecio tu elaborada respuesta. pero no puedo entender como aplicar las consultas.

pensé que habia alguna forma que de una sola consulta obtener el total.
  #8 (permalink)  
Antiguo 29/03/2009, 19:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: bucle con mysql?

Cita:
Iniciado por dannce4life Ver Mensaje
gnzsoloyo, aprecio tu elaborada respuesta. pero no puedo entender como aplicar las consultas.

pensé que habia alguna forma que de una sola consulta obtener el total.
Lo estás obteniendo al sólo agrupar por referido. Creía que se comprendía bien.
El tema es que simplemente el concepto de bucle de búsqueda no existe en la consulta, eso es un concepto de programación de aplicaciones, que el DBMS implementa internamente.
Para una Consulta lo que debes saber es qué es lo que quieres obtener, cómo se deben agrupar los datos para lograrlo, y qué flitros aplicar para que ese agrupamiento sea lógico (Algebra Relacional, le dicen). Para el usuario, el cómo logra eso el DBMS no es importante, conque la respuesta sea la correcta es suficiente. Ese es uno de los aspectos de la diferencia de visión entre los arquitectos de software y los arquitectos de datos.

Esto:
Código sql:
Ver original
  1. SELECT referido, COUNT(*)  compras_referidos
  2. FROM usuario INNER JOIN compra USING(usuario_id)
  3. WHERE referido = 'juan'
  4. GROUP BY referido;

te devuelve lo que estás buscando: El total de compras realizados por los usuarios referidos por 'juan'.
Nada más.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 29/03/2009 a las 19:54
  #9 (permalink)  
Antiguo 30/03/2009, 10:31
Avatar de dannce4life  
Fecha de Ingreso: junio-2008
Ubicación: localhost
Mensajes: 137
Antigüedad: 15 años, 9 meses
Puntos: 6
Respuesta: bucle con mysql?

si, eso es exactamente lo que estoy buscando.
claro, al estar muy familiarizado con la arquitectura de software, este, que es un nuevo mundo para mi me dificulta la logica en un principio.

pero creo que solo es cuestion de tiempo para que le agarre la mano.

un saludo y muchas gracias.
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 16:17.