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. 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 ...

  #31 (permalink)  
Antiguo 07/01/2013, 09:15
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

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
  #32 (permalink)  
Antiguo 07/01/2013, 12:12
 
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
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
Aquí el problema que veo, es que en la tabla Simulador, faltarían 3 registros, pues debe haber el mismo número de registros y con los mismos id en las dos tablas, con tu ejemplo sería algo así:

Usuarios

id |nombre |apellidos |codigo |id_sponsor
1|Pepe|Gómez|1001|-1 -- No puede ser sponsor de sí mismo, para que no aparezca vacío, le pongo "-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|100|4|2
3|25|1|4
4|82|8|2
5|82|8|3
6|82|8|2
7|82|8|1

Con este ejemplo, lo que yo necesitaría es lo siguiente:

id|Nbre|Ape|sp|Cod|imp|rf|sp_imp|sp_rf|cual
1|Pepe|Gómez|-1|1001|500|2|X|X|2
2|Juan|López|1|1002|100|4|500|2|2
3|Jorge|Pérez|1|1003|25|1|500|2|4
4|Ángel|Aguirre|2|1004|82|8|100|4|2
5|Luis|Vázquez|2|1005|0|0|100|4|3
6|Juan|Sánchez|2|1006|0|0|100|4|2
7|Luis|Bernáldez|2|1007|0|0|100|4|1

Como ves, en cada registro, aparecen los importes como usuario y de su sponsor, lo mismo para los referidos.

Cita:
Iniciado por jurena Ver Mensaje
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.
Como he puesto arriba, el -1 es para el sponsor del primer referido, para que no quede vacío y para casos especiales en los que se pone "a mano" porque, por la razón que sea, no deben estar entre los autoincrementables (por ejemplo, el que sería usuario 0, que no se debe mostrar, pero sí es necesario para la lógica del sistema y si lo dejo en 0, no me lo admite porque es NOT NULL) y el campo mostrar es para los desactivados, que en este caso tampoco deben aparecer.

Cita:
Iniciado por jurena Ver Mensaje
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).
Por lo que veo, aquí está el error de mi explicación, que es lo que ha liado todo: no es el importe como sponsor si no el importe de su sponsor

Cita:
Iniciado por jurena Ver Mensaje
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.
Creo que ahora sí he conseguido, basándome en lo que tú habías puesto, ejemplificar lo que realmente necesito. Hasta para el ejemplo he necesitado tu ayuda

Cita:
Iniciado por jurena Ver Mensaje
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...
No creo que sea necesario empezar desde cero, al menos eso espero.

El tema del array es porque esta tabla debe variar según los referidos que se seleccionen y mediante la programación, tengo que conseguir que, tras varios bucles de proceso, en los cuales se van sumando cantidades al campo importe y aumentando 1 al campo cual, el campo referidos quede en 0, puesto que eso significa que el proceso está completo, al no quedar referidos por repartir.

Tampoco voy a explicar aquí la programación porque luego los moderadores se enfadan conmigo, y con razón, porque, como tú dices, en este foro no se pueden tratar estas cuestiones.

A ver si ahora ya conseguimos dar en el clavo...

.

Última edición por rbczgz; 07/01/2013 a las 12:14 Razón: Error en las citas y respuestas
  #33 (permalink)  
Antiguo 07/01/2013, 13:41
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

Prueba esto:
Código MySQL:
Ver original
  1. SELECT usu.nombre, usu.apellidos, usu.id, usu.codigo, IFNULL( sim.importe, 0 ) impusu, IFNULL( sim.referidos, 0 ) refusu, sim.cual, usu.id_sponsor, T1.sp_importe, T1.sp_referidos
  2. FROM usuarios usu
  3. LEFT JOIN simulador sim ON ( usu.id = sim.id_usuario )
  4.  
  5. SELECT usu.id_sponsor, usu.id, SUM( importe ) sp_importe, SUM( referidos ) sp_referidos
  6. FROM `usuarios` usu
  7. INNER JOIN simulador sim ON usu.id = sim.id_usuario
  8. GROUP BY usu.id_sponsor
  9. )T1 ON usu.id_sponsor = T1.id_sponsor
  10. GROUP BY usu.id
  #34 (permalink)  
Antiguo 23/01/2013, 10:50
 
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,

Mis disculpas por no haber dicho nada en todo este tiempo.

En teoría parece que la última consulta sí funciona, pero como tengo que revisar la programación, hasta que no lo haga, no podré saber si realmente está todo correcto, ya que, como dije al principio de toda esta historia, van de la mano programación y consulta MySQL.

Por el momento, debido a otras urgencias, he tenido que dejar aparcado el simulador para más adelante.

Cuando lo pueda retomar, postearé aquí si ha funcionado o no.

Muchas gracias por toda la colaboración, seguiremos en la brecha.

.

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 22:28.