Ver Mensaje Individual
  #31 (permalink)  
Antiguo 07/01/2013, 09:15
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Consulta múltiple con INNER JOIN

Los datos que yo uso

Usuarios

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


Simulador

id_usuario |importe |referidos |cual
1|500|2|2
2|1000|4|4
3|25|1|6
4|82|8|8

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

El resultado obtenido
1|Pepe|Gómez|1|1001|500|2|1525|7|2
2|Juan|López|1|1002|1000|4|82|8|4
3|Jorque|Pérez|1|1003|25|1|0|0|6
4|Ángel|Aguirre|2|1004|82|8|0|0|8
5|Luis|Vázquez|2|1005|0|0|0|0|NULL
6|Juan|Sánchez|2|1006|0|0|0|0|NULL
7|Luis|Bernáldez|2|1007|0|0|0|0|NULL

Aunque en estos datos falta el campo mostrar, lo he añadido después y no hay problema. No entiendo por qué buscas filtrando usu2.id > 0, pues se trata de un autoincrement y aunque no se trate de él no creo que guardes ningún valor 0 o negativo (sospecho que sí, pues me pareció ver un -1), y si lo haces no has explicado por qué y cómo relacionarlo. Bueno, como eso lo sabrás tú mejor, nos dirás algo al respecto.
Creo, como ves, que los datos salen bien o por lo menos lo parecen. Haz la prueba tú. Yo he quitado los filtros de la consulta, es decir, el WHERE, pero como los tenías no tendrían que dar ningún problema.
Respecto a que te ofrece los mismos datos sumando que sin sumar, en algún caso tiene que ocurrir así. Me explico: si sólo tienes un registro de un usuario con una cantidad, al mostrarlo da igual que uses importe que SUM(importe), si hay un solo importe de ese usuario, y siempre habrá uno solo como usuario; distinto es su importe como sponsor. Puede o no puede dar lo mismo usando sum o no, pero hay que usarlo, pues quieres la cantidad de ese sponsor. Naturalmente no podrás usar suma para todas esas cantidades de sponsor que te salen en el listado, pues el total será erróneo para eso. Parece que tú querías mostrar el importe de ese usuario como usuario (1 solo) y al lado su importe como sponsor(serán ninguno, uno o varios, que habrá que sumar).

No es que sea de locos (y todos aquí somos bastante cabezones, si por cabezón entiendes que probamos y probamos hasta encontrar la solución, analizando, cambiando, consultando, etc.), pero para resolver estas cuestiones debes dar los datos de manera completa y precisa, con todas las posibilidades que pueden darse, ejemplificando con datos concretos y ofreciendo las salidas que quieres. Y es mejor hacerlo con pocos datos con los que sea fácil comprobar los errores y problemas.
Respecto al array del que me hablas y la programación, aquí, en este foro, no podemos tratar estas cuestiones, y realmente, esta consulta debería darte el resultado, sin necesidad de usar luego ningún array para trabajar más con los datos. Cosa distinta es que se trate de un ejercicio concreto que te hayan pedido, y en ese caso nos falta información previa. Mira los datos y dinos si conviene volver a empezar de cero...

Última edición por jurena; 07/01/2013 a las 09:29