Ver Mensaje Individual
  #28 (permalink)  
Antiguo 07/01/2013, 05:19
rbczgz
 
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