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

Consulta múltiple con INNER JOIN

Estas en el tema de Consulta múltiple con INNER JOIN en el foro de Mysql en Foros del Web. Hola a tod@s, Aquí estoy como de costumbre, con mis sistemas de afiliados que no me dejan dormir. Lo que pretendo ahora es hacer un ...

  #1 (permalink)  
Antiguo 20/12/2012, 15:13
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Consulta múltiple con INNER JOIN

Hola a tod@s,

Aquí estoy como de costumbre, con mis sistemas de afiliados que no me dejan dormir.

Lo que pretendo ahora es hacer un simulador, para ello he creado una tabla específica con la siguiente estructura:

Código MySQL:
Ver original
  1. CREATE TABLE IF NOT EXISTS `simulador` (
  2.   `id_usuario` int(7) NOT NULL,
  3.   `importe` decimal(20,2) NOT NULL default '0.00',
  4.   `referidos` int(7) NOT NULL default '0',
  5.   `cual` int(7) NOT NULL default '0',
  6.   PRIMARY KEY  (`id_usuario`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;

Entonces, teniendo otra tabla con los datos completos de los usuarios, que no voy a colocar aquí por no ocupar sitio innecesariamente, pretendo hacer la siguiente consulta:

Código MySQL:
Ver original
  1. SELECT  usu.id,
  2.         usu.nombre,
  3.         usu.apellidos,
  4.         usu.id_sponsor,
  5.         sp.id_usuario AS sim_sp,
  6.         usu.codigo,
  7.         sim.id_usuario,
  8.         sim.importe,
  9.         sp.importe AS sp_importe,
  10.         sim.referidos,
  11.         sp.referidos AS sp_referidos
  12. FROM usuarios AS usu
  13. INNER JOIN simulador AS sim ON (usu.id = sim.id_usuario)
  14. INNER JOIN simulador AS sp ON (sp.id_usuario = usu.id_sponsor)
  15. GROUP BY usu.id
  16. ORDER BY usu.id ASC";

Lo que pretendo es obtener, después de procesar el resultado, obtener en una variable el importe del sponsor (sp_importe) y los referidos del sponsor (sp_referidos), teniendo que realizar posteriormente actualizaciones en función de los datos de estos dos campos.

El sponsor lo debemos obtener de la tabla usuarios mediante el id_sponsor del usuario que estamos procesando (id en la tabla usuarios que es el mismo que id_usuario en la tabla simulador) y, este id_sponsor, debe ser el correspondiente al de la tabla simulador.

Entonces, por un lado, debemos tener los datos referidos e importe (del usuario) y por otro los datos sp_referidos y sp_importe (del usuario), pero ambos pares de datos corresponden a la misma tabla (simulador) y se relacionan por medio de la tabla usuarios.

La pregunta es ¿en esta consulta obtengo los datos correctos en los campos pretendidos?

¿Cómo debería procesar estos resultados para asignar cada dato en una variable que posteriormente pueda usar para las actualizaciones (UPDATE)?

Muchas gracias por la ayuda que me podáis brindar.

.
  #2 (permalink)  
Antiguo 21/12/2012, 02:11
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Hola de nuevo...

¿No hay nadie que me pueda despejar las dudas?

Más que nada es que tengo la cabeza hecha un lío y ya no sé si lo estoy haciendo bien.

Espero que alguien pueda ayudarme...

.
  #3 (permalink)  
Antiguo 21/12/2012, 03:30
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: Consulta múltiple con INNER JOIN

Cita:
El sponsor lo debemos obtener de la tabla usuarios mediante el id_sponsor del usuario que estamos procesando (id en la tabla usuarios que es el mismo que id_usuario en la tabla simulador) y, este id_sponsor, debe ser el correspondiente al de la tabla simulador.
Si un usuario tiene un único sponsor y un sponsor es un usuario a su vez, y quieres los datos del sponsor del usuario, debes cruzar la tabla usuarios con sigo misma:
Código MySQL:
Ver original
  1. FROM usuarios U INNER JOIN usuarios S ON U.id_sponsor = S.id_usuario
Recién entonces pues cruzar eso con la siguiente para obtener del usuario los referidos.
Lo que no parece quedar claro es qué es lo que contiene ese campo "referidos". ¿Es un valor único por registro, o es un conjunto de valores? ¿Qué representa ese dato?

PD: Tienes que aprender a tener paciencia. Uno también tiene vida, familia y actividades. Pusiste el post a las seis de la tarde... No conozco las costumbres de Zaragoza, pero aquí, por ejemplo, cenamos cerca de las nueve de la noche, e incluso más tarde.
Más de uno está festejando en estos días.

Ten paciencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 21/12/2012, 05:39
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Lo primero, gracias gnzsoloyo por responder a mi gran duda.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Si un usuario tiene un único sponsor y un sponsor es un usuario a su vez, y quieres los datos del sponsor del usuario, debes cruzar la tabla usuarios con sigo misma:
Código MySQL:
Ver original
  1. FROM usuarios U INNER JOIN usuarios S ON U.id_sponsor = S.id_usuario
Recién entonces pues cruzar eso con la siguiente para obtener del usuario los referidos.
Lo he hecho así y me da el mismo resultado:

Código MySQL:
Ver original
  1. SELECT usu.id,
  2.         usu.nombre,
  3.         usu.apellidos,
  4.         usu.id_sponsor,
  5.         sp.id_usuario AS sim_sp,
  6.         usu.codigo,
  7.         sim.id_usuario,
  8.         sim.importe,
  9.         sim.cual,
  10.         sp.importe AS sp_importe,
  11.         sim.referidos,
  12.         sp.referidos AS sp_referidos
  13. FROM usuarios AS usu
  14. INNER JOIN usuarios AS S ON (usu.id_sponsor = S.id)
  15. INNER JOIN simulador AS sim ON (usu.id = sim.id_usuario)
  16. INNER JOIN simulador AS sp ON (sp.id_usuario = usu.id_sponsor)
  17. WHERE usu.mostrar = 1 AND usu.id > 0
  18. GROUP BY usu.id
  19. ORDER BY usu.id ASC

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Lo que no parece quedar claro es qué es lo que contiene ese campo "referidos". ¿Es un valor único por registro, o es un conjunto de valores? ¿Qué representa ese dato?
Este campo debe contener, inicialmente, un valor numérico obtenido de un formulario que solo tiene ese campo, después, mediante PHP, se le van sumando cuando actúa como sponsor y restando cuando actúa como usuario para realizar la simulación.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
PD: Tienes que aprender a tener paciencia. Uno también tiene vida, familia y actividades. Pusiste el post a las seis de la tarde... No conozco las costumbres de Zaragoza, pero aquí, por ejemplo, cenamos cerca de las nueve de la noche, e incluso más tarde.
Más de uno está festejando en estos días.

Ten paciencia.
Tienes mucha razón, pero ya sabes que cuando ves tan cerca la solución, te desesperas por llegar a ella, pero es cierto que hay que tener paciencia.

Aquí en Zaragoza, también cenamos sobre la misma hora, pero tenemos 4 de diferencia con BBAA, ayer lo posteé tan tarde por lo que te comentaba, desesperado ya por conseguir resolverlo... Normalmente a esas horas, ya estoy "Off", pero ayer me quedé enganchado...

Mientras intentamos resolver este "entuerto", te deseo a ti y a todos los amigos de estos foros unas MUY FELICES FIESTAS.

Muchas gracias de nuevo y espero que podamos encontrar la solución.

.
  #5 (permalink)  
Antiguo 24/12/2012, 03:38
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Hola de nuevo,

¿Nadie que me pueda echar un cable?

Ya sé que estas fechas son de estar en familia, pero si alguien tiene un ratillo...

Gracias por adelantado.

.
  #6 (permalink)  
Antiguo 24/12/2012, 04:45
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: Consulta múltiple con INNER JOIN

Yo no le encuentro mucho sentido a esto:
Código MySQL:
Ver original
  1. INNER JOIN simulador AS sim ON (usu.id = sim.id_usuario)
  2. INNER JOIN simulador AS sp ON (sp.id_usuario = usu.id_sponsor)
Para cumplir esa condición parecería que debe cumplirse que usuario y sponsor fuesen el mismo.
Por otro lado, no termino de entender para qué necesitas invocar dos veces a la tabla Simulador, cuando según se infería antes, cada entrada en Simulador sólo se relaciona con una única entrada de Usuario.
Entendamos lo que se infiere:
- Un usuario, tiene un sólo sponsor.
- Cada usuario puede tener N entradas en Simulador.
- La entrada en simulador se relaciona con los Sponsors, sólo por medio del Usuario.

En ese contexto, relacionar simulador con un Sponsor, requeriría que hubiese dos entradas al simulador, una por cada uno, tales que ambas entradas a su vez estuviesen relacionadas entre si... cosa que no se puede deducir de lo que planteas, ni tampoco lo determinas en tu consulta (no es inferible).
La lógica del sistema, francamente, no se entiende sin que nos expliques exactamente qué representa. Y si no entendemos la lógica del sistema, es difícil decir si la consulta está bien, o si las tablas cumplen con las necesidades del sistema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/12/2012, 06:41
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Gracias de nuevo gnzsoloyo por tu respuesta,

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Yo no le encuentro mucho sentido a esto:
Código MySQL:
Ver original
  1. INNER JOIN simulador AS sim ON (usu.id = sim.id_usuario)
  2. INNER JOIN simulador AS sp ON (sp.id_usuario = usu.id_sponsor)
Para cumplir esa condición parecería que debe cumplirse que usuario y sponsor fuesen el mismo.
La verdad es que yo tampoco le encuentro mucho sentido, no estoy nada seguro de lo que estoy haciendo...

Realmente, sí deben ser el mismo, pero ocupando diferentes roles, es decir, en un caso es para que los campos nombre, apellidos y código (obtenidos de la tabla usuarios) sean del usuario (en la tabla simulador) y en otro caso para que los campos referidos e importe sean los del sponsor del usuario (en la tabla simulador) que estamos tratando.


Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por otro lado, no termino de entender para qué necesitas invocar dos veces a la tabla Simulador, cuando según se infería antes, cada entrada en Simulador sólo se relaciona con una única entrada de Usuario.
Entendamos lo que se infiere:
- Un usuario, tiene un sólo sponsor.
- Cada usuario puede tener N entradas en Simulador.
- La entrada en simulador se relaciona con los Sponsors, sólo por medio del Usuario.
Respecto a esto, aclaro:

Cita:
Iniciado por gnzsoloyo Ver Mensaje
- Un usuario, tiene un sólo sponsor..
Correcto, así es.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
- Cada usuario puede tener N entradas en Simulador.
No, cada usuario solo puede tener una entrada en simulador, por lo que veo esta es una parte del problema.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
- La entrada en simulador se relaciona con los Sponsors, sólo por medio del Usuario.
No entiendo bien, pero intentaré explicarlo:

El usuario en simulador, necesito relacionarlo con su sponsor, esto solo lo puedo hacer a través de la tabla usuarios que es donde esta el campo id_sponsor en cada registro (usuario), para lo que explico más adelante.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En ese contexto, relacionar simulador con un Sponsor, requeriría que hubiese dos entradas al simulador, una por cada uno, tales que ambas entradas a su vez estuviesen relacionadas entre si... cosa que no se puede deducir de lo que planteas, ni tampoco lo determinas en tu consulta (no es inferible).
Esta parte no la entiendo

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La lógica del sistema, francamente, no se entiende sin que nos expliques exactamente qué representa. Y si no entendemos la lógica del sistema, es difícil decir si la consulta está bien, o si las tablas cumplen con las necesidades del sistema.

Voy a intentar explicar lo que pretendo, ya que en lo que se refiere a la consulta estoy más que perdido...

Tenemos todos los usuarios en las dos tablas, con el mismo id, en la tabla usuarios es el campo id y en la tabla simulador, es el campo id_usuario (simplemente es porque cuando comencé el sistema, no pensaba que fuese a crecer tanto y por eso solo puse id en el campo de la tabla usuarios, no hay otro motivo).

Bien, de la tabla usuarios debemos obtener el nombre, apellidos, código y el id_sponsor, los 3 primeros son solo para mostrar los resultados con esos datos, el 4º es para relacionar el usuario con su sponsor en la tabla simulador, puesto que luego debemos actualizar los campos referidos e importe correspondiente al id de usuario del sponsor en esta última tabla.

De lo que no estoy seguro es de la consulta que debo hacer para obtener estos datos y luego poder actualizar esos dos campos, creo que de la forma que lo estoy haciendo, lo que actualizo son los dos campos, pero referente al usuario en vez de a su sponsor.

No sé si se entenderá, pero de verdad que yo en mi cabeza lo tengo muy claro... otra cosa es conseguir explicarlo para que me puedas ayudar...

Muchas gracias de nuevo.

.
  #8 (permalink)  
Antiguo 26/12/2012, 14:29
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Hola de nuevo,

¿Alguna idea con las nuevas explicaciones?

Sigo totalmente perdido...

Gracias de nuevo.

.
  #9 (permalink)  
Antiguo 04/01/2013, 06:43
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Hola de nuevo,

Después de unos días ausente por la festividades navideñas en los que no he parado de darle vueltas a este tema, sigo sin encontrar la solución...

¿Alguien me puede echar una mano?

Muchas gracias.

.
  #10 (permalink)  
Antiguo 04/01/2013, 09:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

rbczgc,
yo, sin haber leído con toda la atención que debiera los posts del hilo, me pregunto si, como creo, el problema es que estás usando como tabla de referencia para todas las personas y lo importante en lo que se refiere al sponsor es la tabla simulador, es decir, que sponsors son solo aquellos cuyo id_usuario aparece en la tabla simulador. Creo que podemos empezar con una consulta como esta y luego y perfilando lo que quieres. Así quizás podamos ayudarte mejor:
Observa esta consulta:
Código MySQL:
Ver original
  1. SELECT sim.id_usuario,
  2.    SUM(sim.importe) totimporte, SUM(sim.referidos) totreferidos
  3.  FROM simulador sim
  4.  INNER JOIN usuarios usu ON sim.id_usuario = usu.id_sponsor
  5.  GROUP BY sim.id_usuario

Esto te daría el id_usuario del sponsor y sus totales, pero dinos qué te faltaría y qué otro dato querrías obtener referido no al sponsor, sino al usuario o usuarios cuyo sponsor estamos buscando... Para el nombre y apellidos del sponsor tendremos que hacer otro inner join sobre la tabla usuarios con distinto alias. dinos si vamos bien
  #11 (permalink)  
Antiguo 04/01/2013, 10:35
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Cita:
Iniciado por jurena Ver Mensaje
rbczgc,
yo, sin haber leído con toda la atención que debiera los posts del hilo, me pregunto si, como creo, el problema es que estás usando como tabla de referencia para todas las personas y lo importante en lo que se refiere al sponsor es la tabla simulador, es decir, que sponsors son solo aquellos cuyo id_usuario aparece en la tabla simulador. Creo que podemos empezar con una consulta como esta y luego y perfilando lo que quieres. Así quizás podamos ayudarte mejor:
Observa esta consulta:
Código MySQL:
Ver original
  1. SELECT sim.id_usuario,
  2.    SUM(sim.importe) totimporte, SUM(sim.referidos) totreferidos
  3.  FROM simulador sim
  4.  INNER JOIN usuarios usu ON sim.id_usuario = usu.id_sponsor
  5.  GROUP BY sim.id_usuario

Esto te daría el id_usuario del sponsor y sus totales, pero dinos qué te faltaría y qué otro dato querrías obtener referido no al sponsor, sino al usuario o usuarios cuyo sponsor estamos buscando... Para el nombre y apellidos del sponsor tendremos que hacer otro inner join sobre la tabla usuarios con distinto alias. dinos si vamos bien
Gracias por tu respuesta, jurena,

El tema es que lo que necesito son los id's, nombres, apellidos, código, importe y referidos de todos los usuarios, a la vez, necesito el importe y los referidos del sponsor de cada uno, el sponsor se obtiene de la tabla usuarios mediante el campo id_sponsor, pero lo tengo que relacionar con los datos de la tabla simulador puesto que el importe y los referidos están en esta tabla.

En la tabla simulador están todos los id_usuario duplicados de los id de la tabla usuarios, es decir, cada id_usuario de la tabla simulador se corresponde con su id de la tabla usuarios.

La suma de los importes y los referidos debo hacerla mediante programación, pero, lógicamente no sé si la estoy haciendo bien, dado que no sé si con la consulta que tengo planteada estoy obteniendo los datos correctos.

Del sponsor no necesito el nombre y apellidos, solo el importe y los referidos.

A ver si soy capaz de poner un ejemplo y de paso igual hasta me aclaro yo:

Tabla usuarios (solo con los datos que necesitamos para ahorrar espacio)

_____________________________________
|id..|nombre|apellidos|codigo|id_sponsor|
------------------------------
|..1.|.Pepe...|.Gómez.....|..1001..|........-1..|
----------------------------
|..2.|.Juan...|.López.....|..1002..|.........1..|
----------------------------
|..3.|.Jorge..|.Pérez.....|..1003..|.........1..|
-----------------------------
|..4.|.Ángel..|.Aguirre...|..1004..|.........2..|
-----------------------------
|..5.|.Luis...|.Vázquez...|..1005..|.........2..|
-----------------------------
|..6.|.Jorge..|.Pérez.....|..1006..|.........2..|
-----------------------------
|..7.|.Ángel..|.Aguirre...|..1007..|.........2..|
-----------------------------

Tabla simulador

______________________________
|id_usuario|importe|referidos|cual|
----------------------
|.........1..|...500...|.....2.....|......|
-----------------------
|.........2..|..1000...|.....4.....|......|
---------------------
|.........3..|.....0...|.....0.....|......|
---------------------
|.........4..|.....0...|.....0.....|......|
---------------------
|.........5..|.....0...|.....0.....|......|
---------------------
|.........6..|.....0...|.....0.....|......|
---------------------
|.........7..|.....0...|.....0.....|......|
---------------------

Bien, de esto se desprendería que el usuario 1 tiene 2 referidos, por lo que el sponsor del usuario 2, tiene 2 referidos, dado que el sponsor del usuario 2 es el usuario 1.

El campo "cual" es simplemente para validar en la programación, por eso lo dejo vacío, para no liarla.

El tema es que con la consulta que tengo no sé si estoy obteniendo los datos del usuario o del sponsor ni en qué posición exacta del array obtengo cada dato para luego actualizarlo.

No se si se entenderá, si falta de explicar algo, me cuentas e intentaré hacerlo si es que sé cómo explicarlo.

Muchas gracias de nuevo.

.
  #12 (permalink)  
Antiguo 04/01/2013, 11:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Rubén,
ahora te he entendido mejor y creo que podrás hacerlo en una sola consulta si como se ve un usuario solo puede tener un sponsor
Código MySQL:
Ver original
  1. sim.id_usuario, usu.nombre, usu.apellidos,
  2. SUM(sim.importe) totimporte,
  3. SUM(sim.referidos) totreferidos, usu.id_sponsor
  4. FROM simulador sim
  5. INNER JOIN usuarios usu ON sim.id_usuario = usu.id_usuario
  6. GROUP BY sim.id_usuario

Esto te daría el total para cada cliente, y el total de su sponsor, pues el total de cada cliente es el total de su sponsor: solo tiene uno.
  #13 (permalink)  
Antiguo 04/01/2013, 15:08
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Cita:
Iniciado por jurena Ver Mensaje
Rubén,
ahora te he entendido mejor y creo que podrás hacerlo en una sola consulta si como se ve un usuario solo puede tener un sponsor
Código MySQL:
Ver original
  1. sim.id_usuario, usu.nombre, usu.apellidos,
  2. SUM(sim.importe) totimporte,
  3. SUM(sim.referidos) totreferidos, usu.id_sponsor
  4. FROM simulador sim
  5. INNER JOIN usuarios usu ON sim.id_usuario = usu.id_usuario
  6. GROUP BY sim.id_usuario

Esto te daría el total para cada cliente, y el total de su sponsor, pues el total de cada cliente es el total de su sponsor: solo tiene uno.
Gracias de nuevo por tu respuesta jurena,

Por lo que veo, no consigo explicarme, la verdad es que me resulta difícil de plantear, no sé exactamente como explicarlo, a ver si así...

No necesito los totales, lo que necesito son los datos que planteo en la consulta del primer post:

Código MySQL:
Ver original
  1. SELECT  usu.id,
  2.         usu.nombre,
  3.         usu.apellidos,
  4.         usu.id_sponsor,
  5.         sp.id_usuario AS sim_sp,
  6.         usu.codigo,
  7.         sim.id_usuario,
  8.         sim.importe,
  9.         sp.importe AS sp_importe,
  10.         sim.referidos,
  11.         sp.referidos AS sp_referidos
  12. FROM usuarios AS usu
  13. INNER JOIN simulador AS sim ON (usu.id = sim.id_usuario)
  14. INNER JOIN simulador AS sp ON (sp.id_usuario = usu.id_sponsor)
  15. GROUP BY usu.id
  16. ORDER BY usu.id ASC

El tema es que para relacionar el usuario con el sponsor debo hacerlo a través de la tabla usuarios que es donde tengo el id_sponsor en el registro del usuario.

Teóricamente esto se puede almacenar en un array donde array['importe'] será el importe del usuario y array['sp_importe'] será el importe del sponsor, lo mismo con los referidos. Aquí es donde está mi duda, no sé si esta consulta es correcta para obtener estos datos de esta forma.

Yo creo que no porque no consigo el resultado que debería obtener, por eso es que pido ayuda a alguien que me eche una mano para determinar cuál debe ser la buena.

Muchas gracias de nuevo.

.
  #14 (permalink)  
Antiguo 04/01/2013, 16:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Tu problema es que quieres agrupar por id_usuario no sé para qué, si dices que no vas a sumar los totales o algo parecido. Si agrupas por id_usuario por fuerza te mostrará sólo el primer registro de simulador de ese id_usuario, por lo que los otros registros de ese id_usuario no se mostrarán. No nos dices cómo deben salir los datos del ejemplo que pones, lo cual nos sería de ayuda,
empecemos de nuevo (no he probado la consulta):
Código MySQL:
Ver original
  1.   usu.id,
  2.   usu.nombre,
  3.   usu.apellidos,
  4.   sim.importe,
  5.   sim.referidos,
  6.   usu2.id,
  7.   usu2.nombre nombresponsor,
  8.   usu2.apellidos apellidossponsor
  9. FROM simulador sim
  10.   INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  11.   INNER JOIN usuarios usu2 ON sim.id_usuario = usu2.id_sponsor
  12.  ORDER BY sim.id_usuario

Esto te dará todos los resultados de simulador, es decir, los de aquellos usuarios que aparecen en simulador y cada vez que aparecen. No lo he probado, pero debería salir cada registro de simulador con sus datos. Dinos qué querrías agrupar. Piensa que no tienes ningún campo de identificación para esa tabla simulador.
Me explico
Tabla simulador

______________________________
|id_usuario|importe|referidos|cual|
----------------------
|.........1..|...500...|.....2.....|......|
-----------------------
|.........2..|..1000...|.....4.....|......|
como puede ocurrir que un id_usuario aparezca varias veces
|.........1..|...1000...|....4.....|......|
No es posible distinguir este registro del primero si agrupamos por id_usuario, y tampoco por el sponsor que siempre será el mismo.
Dinos qué quieres que salga con los datos que pones en el post donde ofreces datos...
  #15 (permalink)  
Antiguo 04/01/2013, 17:13
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Cita:
Iniciado por jurena Ver Mensaje
Tu problema es que quieres agrupar por id_usuario no sé para qué, si dices que no vas a sumar los totales o algo parecido. Si agrupas por id_usuario por fuerza te mostrará sólo el primer registro de simulador de ese id_usuario, por lo que los otros registros de ese id_usuario no se mostrarán. No nos dices cómo deben salir los datos del ejemplo que pones, lo cual nos sería de ayuda,
empecemos de nuevo (no he probado la consulta):
Código MySQL:
Ver original
  1.   usu.id,
  2.   usu.nombre,
  3.   usu.apellidos,
  4.   sim.importe,
  5.   sim.referidos,
  6.   usu2.id,
  7.   usu2.nombre nombresponsor,
  8.   usu2.apellidos apellidossponsor
  9. FROM simulador sim
  10.   INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  11.   INNER JOIN usuarios usu2 ON sim.id_usuario = usu2.id_sponsor
  12.  ORDER BY sim.id_usuario

Esto te dará todos los resultados de simulador, es decir, los de aquellos usuarios que aparecen en simulador y cada vez que aparecen. No lo he probado, pero debería salir cada registro de simulador con sus datos. Dinos qué querrías agrupar. Piensa que no tienes ningún campo de identificación para esa tabla simulador.
Me explico
Tabla simulador

______________________________
|id_usuario|importe|referidos|cual|
----------------------
|.........1..|...500...|.....2.....|......|
-----------------------
|.........2..|..1000...|.....4.....|......|
como puede ocurrir que un id_usuario aparezca varias veces
|.........1..|...1000...|....4.....|......|
No es posible distinguir este registro del primero si agrupamos por id_usuario, y tampoco por el sponsor que siempre será el mismo.
Dinos qué quieres que salga con los datos que pones en el post donde ofreces datos...
Muchas gracias de nuevo por tu ayuda jurena y perdona por el tiempo que te estoy haciendo perder...

El problema de base es que no termino de entender cómo funcionan las consultas, es decir, para una consulta simple no tengo problema, pero cuando debe ser así, a varias tablas y empezamos con el tema de INNER JOIN y demás, me pierdo, o sea, no sé para qué sirve el GROUP BY exactamente, por ejemplo y por más que reviso el manual, el libro y toda la documentación que encuentro, no consigo entenderlo.

El id_usuario de simulador es una copia del id de usuarios que es único y autoincrementable, por lo tanto, no se va a repetir, como decía, lo que necesito es sacar los datos que ponía en la consulta, teniendo en cuenta que debo separar los campos importe y referidos en dos partes, en una serán los correspondientes al usuario y en la otra los correspondientes a su sponsor.

Lo que no necesito son el nombre y apellidos del sponsor, puesto que, al mostrar los resultados solo debo mostrar el id, nombre, apellidos y código del usuario pero con importe y referidos que le corresponden a ese usuario como sponsor por un lado y como usuario por otro lado.

Sí es posible y de hecho debe ser, que el sponsor aparezca varias veces, o sea, el usuario solo puede tener un sponsor pero un sponsor puede (y debe) tener varios usuarios (referidos).

Espero que con esto me deje ayudar y muchas gracias de nuevo.

.
  #16 (permalink)  
Antiguo 04/01/2013, 18:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Debes probar las consultas. Prueba esta y dinos qué es lo que te molesta.
Código MySQL:
Ver original
  1.       usu.id,
  2.       usu.nombre,
  3.       usu.apellidos,
  4.       sim.importe,
  5.       sim.referidos,
  6.       usu.id_sponsor
  7.     FROM simulador sim
  8.       INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  9.      ORDER BY sim.id_usuario

Si quieres totales por id_usuario tienes que añadir
Código MySQL:
Ver original
  1.       usu.id,
  2.       usu.nombre,
  3.       usu.apellidos,
  4.       SUM(sim.importe),
  5.       SUM(sim.referidos)
  6.     FROM simulador sim
  7.       INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  8.       GROUP BY sim.id_usuario
  9.      ORDER BY sim.id_usuario

Ya solo nos faltarían los importes y referidos como sponsor de cada uno de esos mismos usuarios. ¿Vamos ahora bien? Piensa, por otra parte, que un sponsor no tiene por qué tener datos en simulador como usuario, y que un usuario que tiene datos ahí no tiene por qué ser sponsor. Te lo digo por lo que vendrá después...

Última edición por jurena; 04/01/2013 a las 18:12
  #17 (permalink)  
Antiguo 05/01/2013, 01:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Dime si estoy en lo cierto cuando creo que te equivocas al repetir en usuarios los nombres de los usuarios 6 y 7 que coinciden con los usuarios 3 y 4, pero con distinto sponsor. Tampoco está bien, creo el id_sponsor -1 del usuario id = 1, tal vez sea id_sonsor 1, pero eso supondría que uno puede ser sponsor de sí mismo. Por otra parte el campo codigo no tiene sentido aquí, pues un mismo usuario puede tener distintos codigos.
Cita:
_____________________________________
|id..|nombre|apellidos|codigo|id_sponsor|
------------------------------
|..1.|.Pepe...|.Gómez.....|..1001..|........-1..|
----------------------------
|..2.|.Juan...|.López.....|..1002..|.........1..|
----------------------------
|..3.|.Jorge..|.Pérez.....|..1003..|.........1..|
-----------------------------
|..4.|.Ángel..|.Aguirre...|..1004..|.........2..|
-----------------------------
|..5.|.Luis...|.Vázquez...|..1005..|.........2..|
-----------------------------
|..6.|.Jorge..|.Pérez.....|..1006..|.........2..|
-----------------------------
|..7.|.Ángel..|.Aguirre...|..1007..|.........2..|

-----------------------------
---------------------
Creo que codigo debería ser el campo PK de la tabla simulador y que es allí donde debería repetirse el id_usuario con los demás campos tal y como los tienes, salvo que me digas que el usuario puede cambiar de sponsor y eso es lo que indica el código, pero en ese caso te faltarían fechas. Primero tendremos que resolver esto, pues ya creo haber entendido lo que quieres, una salida como esta (con tus datos)
|id..|nombre|apellidos|codigo|id_sponsor|
------------------------------
|..1.|.Pepe...|.Gómez.....|..1001..|.......1..|
----------------------------
|..2.|.Juan...|.López.....|..1002..|.........1..|
----------------------------
|..3.|.Jorge..|.Pérez.....|..1003..|.........1..|
-----------------------------
|..4.|.Ángel..|.Aguirre...|..1004..|.........2..|
-----------------------------
|..5.|.Luis...|.Vázquez...|..1005..|.........2..|

Tabla simulador

______________________________
codigo|id_usuario|importe|referidos|cual|
----------------------
1001|.........1..|...500...|.....2.....|......|
-----------------------
1002|.........2..|..1000...|.....4.....|......|
---------------------
1003|.........3..|.....0...|.....0.....|......|
---------------------
1004|.........4..|.....0...|.....0.....|......|
---------------------
1005|.........5..|.....0...|.....0.....|......|
---------------------
1006|.........3..|.....0...|.....0.....|......|
---------------------
1007|.........4..|.....0...|.....0.....|......|

id|nombre|apellidos|totimp_us|totreq_us|totimp_sp| totreq_sp
1|Pepe Gómez|500|2|1500 (500+1000)|6 (2+4)
Porque Pepe Gómez tiene que ver con dos codigos de simulador (1001 y 1002), un registro como usuario (1001), y también aparece en simulador otro usuario que lo tiene a él como sponsor (1002) y es sponsor de sí mismo (1001).

Si es esto lo que quieres, se podrá hacer la consulta, creo

Última edición por jurena; 05/01/2013 a las 01:43
  #18 (permalink)  
Antiguo 05/01/2013, 07:27
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

De verdad, jurena, siento darte tanto la lata, pero te ni te imaginas lo agradecido que te estoy por tanta dedicación.

Cita:
Iniciado por jurena Ver Mensaje
Debes probar las consultas. Prueba esta y dinos qué es lo que te molesta.
Código MySQL:
Ver original
  1.       usu.id,
  2.       usu.nombre,
  3.       usu.apellidos,
  4.       sim.importe,
  5.       sim.referidos,
  6.       usu.id_sponsor
  7.     FROM simulador sim
  8.       INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  9.      ORDER BY sim.id_usuario
Esta consulta, perfecta, me muestra el id del sponsor de cada usuario, respecto a los campos importe y referidos, como en la aplicación la consulta no sé si es correcta, tampoco puedo saber si lo que me está mostrando está bien o no, pero eso es culpa mía, por no haber previsto la consulta que debía hacer para obtener los datos correctos...

Cita:
Iniciado por jurena Ver Mensaje
Si quieres totales por id_usuario tienes que añadir
Código MySQL:
Ver original
  1.       usu.id,
  2.       usu.nombre,
  3.       usu.apellidos,
  4.       SUM(sim.importe),
  5.       SUM(sim.referidos)
  6.     FROM simulador sim
  7.       INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  8.       GROUP BY sim.id_usuario
  9.      ORDER BY sim.id_usuario
Esta consulta no es que no funcione, pero no es lo que necesito, puesto que los totales debo sacarlos por medio de programación que es lo que debe hacer el simulador en cuestión.

Cita:
Iniciado por jurena Ver Mensaje
Ya solo nos faltarían los importes y referidos como sponsor de cada uno de esos mismos usuarios. ¿Vamos ahora bien? Piensa, por otra parte, que un sponsor no tiene por qué tener datos en simulador como usuario, y que un usuario que tiene datos ahí no tiene por qué ser sponsor. Te lo digo por lo que vendrá después...
Tienes razón, realmente, si el simulador funciona, llega un momento que el campo referidos estará en 0 y justo en ese momento es cuando sabré si el simulador funciona (ya sé, es paradójico, pero es real, jejeje)

En lo que respecta a usuarios, todos deberán tener datos en el simulador, al menos en el campo importe, ya que la simulación la hacemos con el mismo número de referidos para todos los usuarios.

Es decir, aunque no sea referente a este foro, aclaro, en la aplicación la simulación comienza con, por ejemplo 10 referidos, estos son para cada usuario, y, conforme va corriendo la aplicación, va produciendo lo que se llama un spillover, de forma que, mientras haya un usuario con referidos, debe seguir corriendo la aplicación.

Cita:
Iniciado por jurena Ver Mensaje
Dime si estoy en lo cierto cuando creo que te equivocas al repetir en usuarios los nombres de los usuarios 6 y 7 que coinciden con los usuarios 3 y 4, pero con distinto sponsor. Tampoco está bien, creo el id_sponsor -1 del usuario id = 1, tal vez sea id_sonsor 1, pero eso supondría que uno puede ser sponsor de sí mismo. Por otra parte el campo codigo no tiene sentido aquí, pues un mismo usuario puede tener distintos codigos.
No es que me equivoque, es que se me acabó la imaginación para añadir nombres y apellidos, jejeje, lo siento por la confusión. Realmente lo que cuenta son los campos id y codigo, que, si te fijas, es lo mismo, pero sumando 1000

Cita:
Iniciado por jurena Ver Mensaje
Creo que codigo debería ser el campo PK de la tabla simulador y que es allí donde debería repetirse el id_usuario con los demás campos tal y como los tienes, salvo que me digas que el usuario puede cambiar de sponsor y eso es lo que indica el código, pero en ese caso te faltarían fechas. Primero tendremos que resolver esto, pues ya creo haber entendido lo que quieres, una salida como esta (con tus datos)
|id..|nombre|apellidos|codigo|id_sponsor|
------------------------------
|..1.|.Pepe...|.Gómez.....|..1001..|.......1..|
----------------------------
|..2.|.Juan...|.López.....|..1002..|.........1..|
----------------------------
|..3.|.Jorge..|.Pérez.....|..1003..|.........1..|
-----------------------------
|..4.|.Ángel..|.Aguirre...|..1004..|.........2..|
-----------------------------
|..5.|.Luis...|.Vázquez...|..1005..|.........2..|

Tabla simulador

______________________________
codigo|id_usuario|importe|referidos|cual|
----------------------
1001|.........1..|...500...|.....2.....|......|
-----------------------
1002|.........2..|..1000...|.....4.....|......|
---------------------
1003|.........3..|.....0...|.....0.....|......|
---------------------
1004|.........4..|.....0...|.....0.....|......|
---------------------
1005|.........5..|.....0...|.....0.....|......|
---------------------
1006|.........3..|.....0...|.....0.....|......|
---------------------
1007|.........4..|.....0...|.....0.....|......|

id|nombre|apellidos|totimp_us|totreq_us|totimp_sp| totreq_sp
1|Pepe Gómez|500|2|1500 (500+1000)|6 (2+4)
Porque Pepe Gómez tiene que ver con dos codigos de simulador (1001 y 1002), un registro como usuario (1001), y también aparece en simulador otro usuario que lo tiene a él como sponsor (1002) y es sponsor de sí mismo (1001).

Si es esto lo que quieres, se podrá hacer la consulta, creo
Estoy seguro que que la consulta se debe de poder hacer, lo que pasa es que yo ando algo corto de conocimientos básicos, pero precisamente por eso, me empeño en aprender, y qué mejor manera de aprender que con aplicaciones prácticas de las cosas...

A ver, el código, es como el nombre y los apellidos, un dato más a obtener de cada usuario para mostrarlo al final, el verdadero "meollo" está en obtener los campos importe y referidos como usuario y esos mismos campos como sponsor.

Es decir, si yo hago la consulta:

Código MySQL:
Ver original
  1. SELECT  usu.id,
  2.         usu.nombre,
  3.         usu.apellidos,
  4.         usu.id_sponsor,
  5.         sp.id_usuario AS sim_sp,
  6.         usu.codigo,
  7.         sim.id_usuario,
  8.         sim.importe,
  9.         sp.importe AS sp_importe,
  10.         sim.referidos,
  11.         sp.referidos AS sp_referidos
  12. FROM usuarios AS usu
  13. INNER JOIN simulador AS sim ON (usu.id = sim.id_usuario)
  14. INNER JOIN simulador AS sp ON (sp.id_usuario = usu.id_sponsor)
  15. GROUP BY usu.id
  16. ORDER BY usu.id ASC


Esto se lo asigno al array $datos[] y lo que pretendo obtener es:

$importe = $datos['importe'] - importe como usuario
$referidos = $datos['referidos'] - referidos como usuario
$sp_importe = $datos['sp_importe'] - importe como sponsor
$sp_referidos = $datos['sp_referidos'] - referidos como sponsor
$sim_sp = $datos['sim_sp'] - id de usuario como sponsor en tabla simulador

De forma que, luego en la aplicación le pueda decir algo como (sin refinar, a grandes rasgos):

Sumo al importe del sponsor lo que le corresponde
$sp_importe = $sp_importe + xxxxx
Resto a los referidos del sponsor los que corresponden
$sp_referidos = $sp_referidos - xx

Código MySQL:
Ver original
  1. UPDATE simulador
  2.     SET `importe`= '$sp_importe',
  3.         `referidos`='$sp_referidos'
  4.     WHERE `id_usuario` = '$sim_sp';

Es complicado de explicar porque no puedo incluir código que no sea de base de datos, sería mucho más simple si pudiera incluir unas pequeñas partes de código, pero espero que así se entienda algo mejor.

De verdad que agradezco muchísimo la ayuda, sobre todo si va acompañada de lecciones , no es cuestión de que nadie me de las cosas hechas si no están explicadas, porque entonces no aprendo ¿no crees? Pero sí está genial que haya gente dispuesta a enseñar y a colaborar en el aprendizaje de los demás.

A ver si ahora le damos al punto...

.
  #19 (permalink)  
Antiguo 05/01/2013, 08:57
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Este no es un foro de programación, no lo olvides. Yo voy a proporcionarte una propuesta mediante SQL, es decir, una consulta a la base de datos. Pruébala y verás lo que ocurre:

Código MySQL:
Ver original
  1.    usu2.nombre,
  2.    usu2.apellidos,
  3.    usu2.id IDUSUARIO,
  4.    IFNULL(SUM(t1.impusu),0) ImporteUsuario,
  5.    IFNULL(SUM(t1.refusu),0) RequeridoUsuario,
  6.    IFNULL(SUM(t1.impsp),0) ImporteSponsor,
  7.    IFNULL(SUM(t1.refsp),0) UsuarioSponsor
  8. FROM usuarios usu2 LEFT JOIN ((
  9. SELECT usu.id idusuario, IFNULL( SUM( sim.importe ) , 0 ) impusu, IFNULL( SUM( sim.referidos ) , 0 ) refusu, '0'impsp, '0'refsp
  10. FROM simulador sim
  11. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  12. GROUP BY sim.id_usuario
  13. ORDER BY sim.id_usuario
  14. )
  15.  
  16. SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos )
  17. FROM simulador sim
  18. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  19. GROUP BY usu.id_sponsor
  20. ORDER BY usu.id_sponsor
  21. ))t1 ON usu2.id = t1.idusuario GROUP BY usu2.id ORDER BY usu2.id

con programación tal vez harías por separado las dos consultas y luego al recorrer una comparar con los datos de la otra y pasarlos, o cargar en un array y luego al hacer la segunda carga..., pero eso debes preguntarlo en el foro de programación.
Una breve explicación sobre la consulta. Se trata de dos consultas para traer lo obtenido por un usuario como usuario y como sponsor. Uno mediante UNION ALL desplazando a distinto campo(alias) los datos como usuario y como sponsor. Luego hago una subconsulta con esos datos y los de todos los usuarios (necesario el uso de LEFT),con la que me traigo los nombres, apellidos e id, luego controlo los nulos para las sumas con IFNULL, agrupo por el id (en una consulta el usuario y en la otra el sponsor) y muestro los datos...

Última edición por jurena; 05/01/2013 a las 09:04
  #20 (permalink)  
Antiguo 05/01/2013, 10:55
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Cita:
Iniciado por jurena Ver Mensaje
Este no es un foro de programación, no lo olvides.
Sí, lo sé, tienes razón, pero lo posteé aquí porque lo que necesito realmente es saber cómo debo hacer la consulta para obtener los datos que necesito para la programación.

Cita:
Iniciado por jurena Ver Mensaje
Yo voy a proporcionarte una propuesta mediante SQL, es decir, una consulta a la base de datos. Pruébala y verás lo que ocurre:

Código MySQL:
Ver original
  1.    usu2.nombre,
  2.    usu2.apellidos,
  3.    usu2.id IDUSUARIO,
  4.    IFNULL(SUM(t1.impusu),0) ImporteUsuario,
  5.    IFNULL(SUM(t1.refusu),0) RequeridoUsuario,
  6.    IFNULL(SUM(t1.impsp),0) ImporteSponsor,
  7.    IFNULL(SUM(t1.refsp),0) UsuarioSponsor
  8. FROM usuarios usu2 LEFT JOIN ((
  9. SELECT usu.id idusuario,
  10. IFNULL( SUM( sim.importe ) , 0 ) impusu,
  11. IFNULL( SUM( sim.referidos ) , 0 ) refusu, '0'impsp, '0'refsp
  12. FROM simulador sim
  13. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  14. GROUP BY sim.id_usuario
  15. ORDER BY sim.id_usuario
  16. )
  17.  
  18. SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos )
  19. FROM simulador sim
  20. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  21. GROUP BY usu.id_sponsor
  22. ORDER BY usu.id_sponsor
  23. ))t1 ON usu2.id = t1.idusuario GROUP BY usu2.id ORDER BY usu2.id
La verdad es que te lo has currado como si fuera para ti, te lo agradezco de todo corazón. La he probado pero, aparentemente, no da los datos necesarios, pero como da más datos de los que necesito y, la verdad, es una consulta que a mi se me escapa por completo a pesar de tu estupenda explicación, al dar más datos, ya no sé cómo hacer para que me dé los que necesito solamente y después, en la programación hacer el resto.

Cita:
Iniciado por jurena Ver Mensaje
con programación tal vez harías por separado las dos consultas y luego al recorrer una comparar con los datos de la otra y pasarlos, o cargar en un array y luego al hacer la segunda carga..., pero eso debes preguntarlo en el foro de programación.
La parte de programación la tengo bastante clara, el problema es que si no consigo obtener los datos correctamente, no puedo hacer funcionar el resto, ya que, en esa programación, entre otras cosas, lo que hace es actualizar los campos importe y referidos del sponsor, entonces, si no tengo bien esos dos datos, todo lo demás no anda.

Cita:
Iniciado por jurena Ver Mensaje
Una breve explicación sobre la consulta. Se trata de dos consultas para traer lo obtenido por un usuario como usuario y como sponsor. Uno mediante UNION ALL desplazando a distinto campo(alias) los datos como usuario y como sponsor. Luego hago una subconsulta con esos datos y los de todos los usuarios (necesario el uso de LEFT),con la que me traigo los nombres, apellidos e id, luego controlo los nulos para las sumas con IFNULL, agrupo por el id (en una consulta el usuario y en la otra el sponsor) y muestro los datos...
Creo que entiendo todo excepto lo que se refiere a las sumas, que no sé lo que suma, pero aún así, no soy capaz de armar yo solo la consulta concreta para obtener lo que necesito, he estado intentando modificar la que me has pasado viendo la explicación, pero no hay forma, me da errores que no consigo resolver, en esto es en lo que he dejado la consulta y a continuación el error que me da:

Código MySQL:
Ver original
  1.        usu2.id,
  2.        usu2.nombre,
  3.        usu2.apellidos,
  4.        usu2.codigo,
  5.     FROM usuarios usu2 LEFT JOIN ((
  6.     SELECT usu.id idusuario, sim.importe usuario_importe, sim.referidos usuario_referidos
  7.     FROM simulador sim
  8.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  9.     GROUP BY sim.id_usuario
  10.     ORDER BY sim.id_usuario
  11.     )
  12.     UNION ALL (
  13.      
  14.     SELECT usu.id_sponsor, sim.importe sponsor_importe , sim.referidos sponsor_referidos
  15.     FROM simulador sim
  16.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  17.     GROUP BY usu.id_sponsor
  18.     ORDER BY usu.id_sponsor
  19.     ))t1 ON usu2.id = t1.idusuario GROUP BY usu2.id ORDER BY usu2.id

Este es el error:


Cita:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM usuarios usu2 LEFT JOIN (( SELECT usu.id idusuario, sim.importe usu' at line 6

Y no consigo salir de ahí, no entiendo el error, por lo tanto no lo puedo corregir.

Si me pudieras echar un cable con lo que estoy haciendo mal, a ver si de una buena vez aprendo algo...

Muchas gracias de nuevo.

.
  #21 (permalink)  
Antiguo 05/01/2013, 11:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Rubén,
creo que el problema es tu versión de MySQL, una versión antigua que no acepta subconsultas. Dinos qué versión usas y no te agobies. Vete despacito haciendo pruebas con pedazos por separadom me refiero a los que están antes y después del UNION ALL, pero sin paréntesis, claro. Prueba por separado cada uno de esos select para que veas qué ocurre. Eso sí debería mostrarte datos.
  #22 (permalink)  
Antiguo 05/01/2013, 11:52
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Gracias Jesús, te cuento:

Cita:
Iniciado por jurena Ver Mensaje
Rubén,
creo que el problema es tu versión de MySQL, una versión antigua que no acepta subconsultas. Dinos qué versión usas y no te agobies.
La versión es 5.0.96.

Cita:
Iniciado por jurena Ver Mensaje
Vete despacito haciendo pruebas con pedazos por separadom me refiero a los que están antes y después del UNION ALL, pero sin paréntesis, claro. Prueba por separado cada uno de esos select para que veas qué ocurre. Eso sí debería mostrarte datos.
Sí, me muestra datos, pero son los mismos que con una consulta simple, hago esto:

Código MySQL:
Ver original
  1.    usu2.nombre,
  2.    usu2.apellidos,
  3.    usu2.id IDUSUARIO,
  4.    IFNULL(SUM(t1.impusu),0) ImporteUsuario,
  5.    IFNULL(SUM(t1.refusu),0) RequeridoUsuario,
  6.    IFNULL(SUM(t1.impsp),0) ImporteSponsor,
  7.    IFNULL(SUM(t1.refsp),0) UsuarioSponsor
  8. FROM usuarios usu2 LEFT JOIN (
  9. SELECT usu.id idusuario,
  10. IFNULL( SUM( sim.importe ) , 0 ) impusu,
  11. IFNULL( SUM( sim.referidos ) , 0 ) refusu, '0'impsp, '0'refsp
  12. FROM simulador sim
  13. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  14. GROUP BY sim.id_usuario
  15. ORDER BY sim.id_usuario
  16. )t1 ON usu2.id = t1.idusuario GROUP BY usu2.id ORDER BY usu2.id

Y me muestra el id, nombre, apellidos y código, nada más y si hago esto otro:

Código MySQL:
Ver original
  1. SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos )
  2. FROM simulador sim
  3. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  4. GROUP BY usu.id_sponsor
  5. ORDER BY usu.id_sponsor

Me muestra unos datos muy extraños, porque el campo referidos no debería poder ser negativo y me muestra todos en negativo, aunque puede que ese problema venga de la programación por lo que decía antes, no consigo obtener bien los datos...

No quiero tirar la toalla, pero no sé qué más hacer...

Solo necesito obtener los campos correctos, con la consulta que me has pasado antes, creo que sale casi bien, pero como no sé quitar las sumas sin que se vaya todo al traste, no lo puedo hacer andar...

Simplemente es tener por un lado, los datos básicos: id, nombre, apellidos y código, por otro lado, importe y referidos como usuario y por último, importe y referidos como sponsor, sería algo así:

|..id.|...nombre...|...apellidos...|.codigo.|.spon sor.|......importe.........|......referidos....... ..|....sponsor_importe...|....sponsor_referidos... |
|...1.|...pepe.....|...perez.......|...1001.|..... ..1.|..importecomousuario..|..referidoscomousuario ..|..importedesusponsor..|..referidosdesusponsor.. |
|...2.|...pepe2....|...perez2......|...1002.|..... ..1.|..importecomousuario..|..referidoscomousuario ..|.....importedeid_1....|....referidosdeid_1..... |

Yo no sé cómo hacerlo pero seguro que no es tan difícil como me lo parece a mi sin los conocimientos necesarios...

Además, cuanto más cerca parece que estoy, más nervioso y más ganas me entran de conseguirlo... pero me siento impotente...

.
  #23 (permalink)  
Antiguo 06/01/2013, 03:52
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Lanza sobre tus datos (yo no los tengo y no puedo decirte nada) esta consulta primero:
Código MySQL:
Ver original
  1. SELECT usu.id idusuario,
  2. IFNULL( SUM( sim.importe ) , 0 ) impusu,
  3. IFNULL( SUM( sim.referidos ) , 0 ) refusu, '0' impsp, '0'refsp
  4. FROM simulador sim
  5. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  6. GROUP BY sim.id_usuario
  7. ORDER BY sim.id_usuario

Y luego esta:
Código MySQL:
Ver original
  1. SELECT usu.id_sponsor, '0', '0', IFNULL(SUM( sim.importe ),0) , IFNULL(SUM( sim.referidos ),0)
  2.     FROM simulador sim
  3.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  4.     GROUP BY usu.id_sponsor
  5.     ORDER BY usu.id_sponsor

Y dinos qué pasa. En la primera obtendrás los datos de los usuarios como usuario, y en la segunda los que otienen como sponsor.
  #24 (permalink)  
Antiguo 06/01/2013, 06:39
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Gracias por la respuesta, Jesús, y Feliz día de Reyes.

Cita:
Iniciado por jurena Ver Mensaje
Lanza sobre tus datos (yo no los tengo y no puedo decirte nada) esta consulta primero:
Código MySQL:
Ver original
  1. SELECT usu.id idusuario,
  2. IFNULL( SUM( sim.importe ) , 0 ) impusu,
  3. IFNULL( SUM( sim.referidos ) , 0 ) refusu, '0' impsp, '0'refsp
  4. FROM simulador sim
  5. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  6. GROUP BY sim.id_usuario
  7. ORDER BY sim.id_usuario
He modificado las consultas porque con las sumas no me sirve y he hecho esto:

Código MySQL:
Ver original
  1. SELECT usu.id idusuario, sim.importe impusu, sim.referidos refusu
  2. FROM simulador sim
  3. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  4. GROUP BY sim.id_usuario
  5. ORDER BY sim.id_usuario

Aparentemente me trae bien los datos como usuario, el problema es que, para estar seguro de que los datos están correctos, antes de lanzar una consulta para ver resultados, necesito la que me debe dar los datos sobre los que modificar con la programación y de esa forma, sí podré saber con certeza si los datos son correctos.

Ahora, al haber ejecutado la aplicación con la consulta que tenía, y que ya tengo claro que está mal, me ha grabado datos incorrectos y es prácticamente imposible saber qué es lo que me está dando como resultado, pero lo sigo intentando...

Cita:
Iniciado por jurena Ver Mensaje
Y luego esta:
Código MySQL:
Ver original
  1. SELECT usu.id_sponsor, '0', '0', IFNULL(SUM( sim.importe ),0) , IFNULL(SUM( sim.referidos ),0)
  2.     FROM simulador sim
  3.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  4.     GROUP BY usu.id_sponsor
  5.     ORDER BY usu.id_sponsor

Y dinos qué pasa. En la primera obtendrás los datos de los usuarios como usuario, y en la segunda los que otienen como sponsor.
Esta es la que he ejecutado, también quitando lo referente a las sumas:

Código MySQL:
Ver original
  1. SELECT usu.id_sponsor, sim.importe, sim.referidos
  2. FROM eae_simulador sim
  3. INNER JOIN eae_usuarios usu ON sim.id_usuario = usu.id
  4. GROUP BY usu.id_sponsor
  5. ORDER BY usu.id_sponsor

También aparentemente me trae bien los resultados, pero no sé unir las dos para que en una sola consulta me traiga todos los datos y poder trabajar sobre ellos...

Si ya digo yo que me falta mucha base, pero tampoco tengo donde aprenderla si no es gracias a ti y a todos los que colaboran en estos foros...

Solo espero que me puedas seguir ayudando a ver si conseguimos sacar el resultado bien...

Muchísimas gracias de todo corazón.

.
  #25 (permalink)  
Antiguo 06/01/2013, 10:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

No entiendo por qué dices que con la suma no te sirve. Eso no tiene sentido para mí. Esta consulta te dará los datos de la suma de importes y referidos por cada id¨_usuario
Código MySQL:
Ver original
  1. SELECT usu.id idusuario, SUM(sim.importe impusu), SUM(sim.referidos) refusu
  2.     FROM simulador sim
  3.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  4.     GROUP BY sim.id_usuario
  5.     ORDER BY sim.id_usuario
Si lo que quieres es solo la lista, sin sumas, con datos repetidos no puedes agrupar ni es necesario ordenar...
Código MySQL:
Ver original
  1. SELECT usu.id idusuario, sim.importe impusu, sim.referidos refusu
  2.     FROM simulador sim
  3.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id

¿Ves las diferencias? SUM es una función de agrupado para sumar valores según un criterio coincidente, en este caso el id_usuario.
  #26 (permalink)  
Antiguo 06/01/2013, 12:15
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Muchas gracias por tu paciencia, Jesús,

Cita:
Iniciado por jurena Ver Mensaje
No entiendo por qué dices que con la suma no te sirve. Eso no tiene sentido para mí. Esta consulta te dará los datos de la suma de importes y referidos por cada id¨_usuario
Es sencillo, esa me la sé No me sirve con la suma porque cada registro es un usuario y debo tener el total de cada usuario individualizado, es decir, no se repiten los usuarios, lo único es que en unos casos actúan como usuarios y en otros como sponsor, pero eso es a efectos de programación por lo que aquí no tiene sentido darle vueltas.

Cita:
Iniciado por jurena Ver Mensaje
Código MySQL:
Ver original
  1. SELECT usu.id idusuario, SUM(sim.importe impusu), SUM(sim.referidos) refusu
  2.     FROM simulador sim
  3.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  4.     GROUP BY sim.id_usuario
  5.     ORDER BY sim.id_usuario
Si lo que quieres es solo la lista, sin sumas, con datos repetidos no puedes agrupar ni es necesario ordenar...
Código MySQL:
Ver original
  1. SELECT usu.id idusuario, sim.importe impusu, sim.referidos refusu
  2.     FROM simulador sim
  3.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id

¿Ves las diferencias? SUM es una función de agrupado para sumar valores según un criterio coincidente, en este caso el id_usuario.
Sí, la diferencia la veo y la entiendo, de hecho esta es una de las pocas funciones de MySQL que conozco, aunque en este caso no la puedo aplicar.

Lo que necesito es la lista pero con los datos tanto para cuando el usuario actúa como tal, como para cuando actúa como sponsor, pero, a ser posible, en una misma consulta, de forma que los pueda asociar en programación a un array que luego pueda recorrer y modificar según sea necesario.

Espero que se entienda, no sé que hacer ya, porque no consigo obtener los datos que, en principio, pensaba que sería fácil obtener...

Espero que me puedas ayudar...

.
  #27 (permalink)  
Antiguo 06/01/2013, 15:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Dices que en usuarios un id_usuario aparece nada más que una vez, y así debe ser, pero si un id_usuario se repite en simulador, aunque sea una sola vez, ya tienes que agrupar. Solo en el caso de que todo id_usuario tuviera solo un registro en simulador relacionado podrías no usar ese primer group by. De acuerdo, si es así. Pero en la segunda consulta, es necesario, pues un sponsor lo puede ser de varios usuarios, y eso te obliga a agrupar para sacar la suma de ese sponsor. En ese caso, si tu versión de MySQL permite subconsultas, esta debería funcionar:
A mí me funciona:
Código MySQL:
Ver original
  1.    usu2.nombre,
  2.    usu2.apellidos,
  3.    usu2.id IDUSUARIO,
  4.    IFNULL(t1.impusu,0) ImporteUsuario,
  5.    IFNULL(t1.refusu,0) RequeridoUsuario,
  6.    IFNULL(SUM(t1.impsp),0) ImporteSponsor,
  7.    IFNULL(SUM(t1.refsp),0) UsuarioSponsor
  8. FROM usuarios usu2 LEFT JOIN
  9. ((SELECT usu.id idusuario,
  10. IFNULL(sim.importe, 0 ) impusu,
  11. IFNULL(sim.referidos, 0 ) refusu, '0' impsp, '0'refsp
  12. FROM simulador sim
  13. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  14. ORDER BY sim.id_usuario)
  15. (SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos )
  16. FROM simulador sim
  17. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  18. GROUP BY usu.id_sponsor
  19. ORDER BY usu.id_sponsor))t1
  20. ON usu2.id = t1.idusuario GROUP BY usu2.id ORDER BY usu2.id

Si las tablas se llaman así y los campos también, copia esta consulta y pruébala.
  #28 (permalink)  
Antiguo 07/01/2013, 05:19
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Gracias de nuevo, Jesús,

Cita:
Iniciado por jurena Ver Mensaje
Dices que en usuarios un id_usuario aparece nada más que una vez, y así debe ser, pero si un id_usuario se repite en simulador, aunque sea una sola vez, ya tienes que agrupar. Solo en el caso de que todo id_usuario tuviera solo un registro en simulador relacionado podrías no usar ese primer group by. De acuerdo, si es así.
Sí, es así, en simulador nunca se repite id_usuario, ya que es lo mismo que id en usuarios y ahí es único y autoincrementable.

Cita:
Iniciado por jurena Ver Mensaje
Pero en la segunda consulta, es necesario, pues un sponsor lo puede ser de varios usuarios, y eso te obliga a agrupar para sacar la suma de ese sponsor. En ese caso, si tu versión de MySQL permite subconsultas, esta debería funcionar:
A mí me funciona:
Código MySQL:
Ver original
  1.    usu2.nombre,
  2.    usu2.apellidos,
  3.    usu2.id IDUSUARIO,
  4.    IFNULL(t1.impusu,0) ImporteUsuario,
  5.    IFNULL(t1.refusu,0) RequeridoUsuario,
  6.    IFNULL(SUM(t1.impsp),0) ImporteSponsor,
  7.    IFNULL(SUM(t1.refsp),0) UsuarioSponsor
  8. FROM usuarios usu2 LEFT JOIN
  9. ((SELECT usu.id idusuario,
  10. IFNULL(sim.importe, 0 ) impusu,
  11. IFNULL(sim.referidos, 0 ) refusu, '0' impsp, '0'refsp
  12. FROM simulador sim
  13. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  14. ORDER BY sim.id_usuario)
  15. (SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos )
  16. FROM simulador sim
  17. INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  18. GROUP BY usu.id_sponsor
  19. ORDER BY usu.id_sponsor))t1
  20. ON usu2.id = t1.idusuario GROUP BY usu2.id ORDER BY usu2.id

Si las tablas se llaman así y los campos también, copia esta consulta y pruébala.
Perfecto, funciona en cuanto a que arroja datos que, aparentemente tienen sentido, pero tengo 2 problemas aquí. He ejecutado esta consulta, como verás he cambiado algún alias para que me coincidan con los que había usado ya en el resto de la aplicación y he intentado añadir el campo cual de la tabla simulador, pero no he conseguido que me lo muestre en los resultados; sé que es porque no lo he "colocado" bien, pero lo que no sé es cómo "colocarlo" bien, y sin ese campo, no puedo saber si la aplicación está trabajando conforme a lo que debe hacer, puesto que, al ser un campo de control, necesito consultarlo y actualizarlo según convenga, va la consulta:

Código MySQL:
Ver original
  1.        usu2.id,
  2.        usu2.nombre,
  3.        usu2.apellidos,
  4.        usu2.id_sponsor sim_sp,
  5.        usu2.codigo,
  6.        IFNULL(t1.impusu,0) importe,
  7.        IFNULL(t1.refusu,0) referidos,
  8.        IFNULL(SUM(t1.impsp),0) sp_importe,
  9.        IFNULL(SUM(t1.refsp),0) sp_referidos
  10.     FROM usuarios usu2 LEFT JOIN
  11.     ((SELECT usu.id idusuario, sim.cual,
  12.     IFNULL(sim.importe, 0 ) impusu,
  13.     IFNULL(sim.referidos, 0 ) refusu, '0' impsp, '0'refsp
  14.     FROM simulador sim
  15.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  16.     ORDER BY sim.id_usuario)
  17.     UNION ALL
  18.     (SELECT usu.id_sponsor, sim.cual, '0', '0', SUM( sim.importe ) , SUM( sim.referidos )
  19.     FROM simulador sim
  20.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  21.     GROUP BY usu.id_sponsor
  22.     ORDER BY usu.id_sponsor))t1
  23.     ON usu2.id = t1.idusuario WHERE usu2.mostrar = 1 AND usu2.id > 0 GROUP BY usu2.id ORDER BY usu2.id

Creo que si conseguimos esto, ya estará toda esta parte resuelta y podré dejar de darte la tabarra, que con lo que me estás ayudando, imagino que tendrás ganas de que te deje tranquilo.

Espero que me puedas seguir ayudando...

Muchas gracias de nuevo.

.

Última edición por rbczgz; 07/01/2013 a las 06:35 Razón: Se me había olvidado un WHERE para que no se muestren los que no procede
  #29 (permalink)  
Antiguo 07/01/2013, 07:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

No sé que tipos de valores guardas en el cual para validar, y por eso no puedo ayudarte a mostrar una salida más conveniente, pero para mostrarlo puedes hacerlo así:
Código MySQL:
Ver original
  1.        usu2.id,
  2.        usu2.nombre,
  3.        usu2.apellidos,
  4.        usu2.id_sponsor sim_sp,
  5.        usu2.codigo,
  6.        IFNULL(t1.impusu,0) importe,
  7.        IFNULL(t1.refusu,0) referidos,
  8.        IFNULL(SUM(t1.impsp),0) sp_importe,
  9.        IFNULL(SUM(t1.refsp),0) sp_referidos,
  10.        t1.cual
  11.  
  12.     FROM usuarios usu2 LEFT JOIN
  13.     ((SELECT usu.id idusuario,
  14.     IFNULL(sim.importe, 0 ) impusu,
  15.     IFNULL(sim.referidos, 0 ) refusu, '0' impsp, '0'refsp,
  16.     sim.cual
  17.     FROM simulador sim
  18.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  19.     ORDER BY sim.id_usuario)
  20.     UNION ALL
  21.     (SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos ), sim.cual
  22.     FROM simulador sim
  23.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  24.     GROUP BY usu.id_sponsor
  25.     ORDER BY usu.id_sponsor))t1
  26.     ON usu2.id = t1.idusuario WHERE usu2.mostrar = 1 AND usu2.id > 0 GROUP BY usu2.id ORDER BY usu2.id

Verás NULL cuando no hay nada, es decir, relación. Al no saber qué tipo de datos guardas ahí, poco puedo ayudarte en la salida. Lo que sí tengo claro es que ese cual solo va referido a usuario y no quieres mostrar ningún cual de sponsor.

Última edición por jurena; 07/01/2013 a las 07:08
  #30 (permalink)  
Antiguo 07/01/2013, 08:14
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Consulta múltiple con INNER JOIN

Cita:
Iniciado por jurena Ver Mensaje
No sé que tipos de valores guardas en el cual para validar, y por eso no puedo ayudarte a mostrar una salida más conveniente
El campo es int(7), lo que guardo ahí es un valor númerico para comprobar si es par o impar y, en función de eso, ejecutar lo que corresponda.

Cita:
Iniciado por jurena Ver Mensaje
, pero para mostrarlo puedes hacerlo así:
Código MySQL:
Ver original
  1.        usu2.id,
  2.        usu2.nombre,
  3.        usu2.apellidos,
  4.        usu2.id_sponsor sim_sp,
  5.        usu2.codigo,
  6.        IFNULL(t1.impusu,0) importe,
  7.        IFNULL(t1.refusu,0) referidos,
  8.        IFNULL(SUM(t1.impsp),0) sp_importe,
  9.        IFNULL(SUM(t1.refsp),0) sp_referidos,
  10.        t1.cual
  11.  
  12.     FROM usuarios usu2 LEFT JOIN
  13.     ((SELECT usu.id idusuario,
  14.     IFNULL(sim.importe, 0 ) impusu,
  15.     IFNULL(sim.referidos, 0 ) refusu, '0' impsp, '0'refsp,
  16.     sim.cual
  17.     FROM simulador sim
  18.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  19.     ORDER BY sim.id_usuario)
  20.     UNION ALL
  21.     (SELECT usu.id_sponsor, '0', '0', SUM( sim.importe ) , SUM( sim.referidos ), sim.cual
  22.     FROM simulador sim
  23.     INNER JOIN usuarios usu ON sim.id_usuario = usu.id
  24.     GROUP BY usu.id_sponsor
  25.     ORDER BY usu.id_sponsor))t1
  26.     ON usu2.id = t1.idusuario WHERE usu2.mostrar = 1 AND usu2.id > 0 GROUP BY usu2.id ORDER BY usu2.id

Verás NULL cuando no hay nada, es decir, relación. Al no saber qué tipo de datos guardas ahí, poco puedo ayudarte en la salida. Lo que sí tengo claro es que ese cual solo va referido a usuario y no quieres mostrar ningún cual de sponsor.
Cierto, solo va referido a usuario y no a sponsor.

Pero sigo teniendo un problema: no obtengo el dato correcto en sp_importe y sp_referidos, he probado a no sumar, dado que no debería tener que sumar los valores de diferentes registros pero tampoco me funciona...

Es decir, si yo ejecuto la consulta, para mostrar los resultados en pantalla fuera de PHPMyAdmin, la almaceno en un array, recorro ese array y, en función de los valores que van adquiriendo los diferentes campos, ejecuto un código u otro, los elementos del array, es decir, los campos, me muestran siempre los mismos valores, tanto sumando como sin sumar... es muy raro...

No termino de entender la consulta en sí, para mi es muy compleja, por eso no sé hacerle los cambios como el que te planteaba en el post anterior, pero, aparte de eso, yo creo que por lo que me dices, sí debería mostrar bien los valores, pero no es así y no sé por qué...

A ver, si yo, en la aplicación tengo el campo sp_importe referido al usuario id 3 y el sponsor de este usuario es el id 1, debería mostrarme el campo importe correspondiente al usuario id 1, pero me muestra otra cifra que no tiene nada que ver con lo que debería mostrar...

Esto es de locos, al final va a resulta que no se va a poder hacer y nos estamos rompiendo la cabeza para nada...

Pero, no sé por qué, tengo la certeza de que sí se puede, solo hace falta saber cómo, el problema es que yo no sé ese cómo

Solo espero que al final, después de tanta lata que te estoy dando, sirva de algo y lo consigamos...

Te agradezco mucho el tiempo que me estás dedicando para enseñarme, pero como buen maño, tengo la cabeza dura y me cuesta aprender... jejeje.

.

Etiquetas: join, múltiple, resultados, select, tabla, campos
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 09:27.