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

Un Select un poco complicado

Estas en el tema de Un Select un poco complicado en el foro de Mysql en Foros del Web. Hola amigos como estais, Vereis tengo este select: Select * From cuotas u Inner Join cuotas_usuarios c on u.Ncuota = c.Ncuota and u.fecha = '2011' ...
  #1 (permalink)  
Antiguo 21/02/2011, 05:25
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Un Select un poco complicado

Hola amigos como estais,

Vereis tengo este select:

Select * From cuotas u Inner Join cuotas_usuarios c on u.Ncuota = c.Ncuota and u.fecha = '2011' Join usuarios a On c.Nusuario = a.Nusuario WHERE a.Ngrupo = '1' ORDER BY c.pagado DESC


Lo que quiero con este select seria mostrar en la parte de arriba del grid los usuarios que han pagado la cuota, la cosa es que cada usuario puede tener varias cuotas entonces tal como esta, solo esta poniendo arriba la couta que esta pagado y lo que necesito es que si una de las dos cuotas esta pagada ponga a ese usuario con la couta que esta pagada y la que no encima de otro que no ha pagado ninguna.

A ver si alguien sabe como se podria hacer esto.

Un saludo amigos y gracias de ante mano.
  #2 (permalink)  
Antiguo 21/02/2011, 05:54
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Un Select un poco complicado

Pon un ejemplo porque no se entiende bien (al menos yo). Supongamos que tenemos cinco usuarios, todos con dos cuotas, los usuarios 1 y 2 tienen las dos cuotas pagadas, el 3 una pagada y una por pagar y el 4 y el 5 las dos sin pagar, ¿cual sería la salida de lo que quieres hacer?
¿Aparecerían todos los usuarios dos veces al tener dos cuotas?
¿No aparecería ningún usuario dos veces?
¿Sólo el tres por tener cuotas en distintos estados?
  #3 (permalink)  
Antiguo 21/02/2011, 06:01
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Hola amigo, gracias por tu respuesta,

Pues la idea seria la siguiente:

Nombre-------|---------Pagado
-------------|------------
Paco ---------|---------- si
-------------|------------
Paco ---------|---------- si
-------------|------------
Juan ---------|-----------si
-------------|------------
Juan ---------|----------No
-------------|------------
Pedro---------|----------No
-------------|------------
Pedro --------|----------No


La idea es que muestre el resultado de las dos cuotas, y que ponga por delante a los usuarios que han pagado las dos o almenos una de ellas, espero que est un poco mas claro.

Un saludo y gracias de nuevo

Última edición por franjgg; 21/02/2011 a las 06:07
  #4 (permalink)  
Antiguo 21/02/2011, 06:10
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, 5 meses
Puntos: 2658
Respuesta: Un Select un poco complicado

Yo lo probaría mejor:
Código MySQL:
Ver original
  1.     A.*,
  2.     COUNT(*) Pagadas
  3.     usuarios a
  4.     LEFT JOIN cuotas u ON c.Nusuario = a.Nusuario
  5.     INNER JOIN cuotas_usuarios c ON u.Ncuota = c.Ncuota     AND u.fecha = '2011'
  6.     a.Ngrupo = '1'  
  7. ORDER BY Pagadas DESC
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/02/2011, 06:38
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Hola gnzsoloyo gracias por tu respuesta,

He probado el sql directamente sobre phpmyadmin y me esta dando un error, como que no encuentra la tabla A.

Por si sirve de algo decir que la tabla usuario solo tiene informacion perosonal y el Ngrupo.
La table cuotas tiene el Ncuota
Y la tabla cuotas_usuarios tiene el Ncuota de la tabla cuota y el campo pagada, en esta tabla estaria las 2 cuotas de cada usuario

Un saludo y gracias amigos
  #6 (permalink)  
Antiguo 21/02/2011, 06:52
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, 5 meses
Puntos: 2658
Respuesta: Un Select un poco complicado

Cita:
He probado el sql directamente sobre phpmyadmin y me esta dando un error, como que no encuentra la tabla A. En ese caso debes tener cuidado porque Linux es sensible a mayuscula y minusculas...
SI el servidor es remoto, y está basado en Linux, el problema es que para Linux "A" y "a" no representan el mismo alias.
Código MySQL:
Ver original
  1.     a.*,
  2.     COUNT(*) Pagadas
  3.     usuarios a
  4.     LEFT JOIN cuotas u ON c.Nusuario = a.Nusuario
  5.     INNER JOIN cuotas_usuarios c ON u.Ncuota = c.Ncuota     AND u.fecha = '2011'
  6.     a.Ngrupo = '1'  
  7. ORDER BY Pagadas DESC
__________________
¿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 21/02/2011, 07:02
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

mm, es cierto amigo,

He ejecutado el sql y me reporta este error: Unknown column 'c.Nusuario' in 'on clause'

Decir por si si acaso que la tabla cuotas no tiene un campo Nusuario este campo estaria en la tabla cuotas_usuarios y tambien en la tabla usuarios.

Y en la tabla cuotas_usuarios tambien indica si ha pagado o no.

Siento ser muy pesado

Última edición por franjgg; 21/02/2011 a las 07:41
  #8 (permalink)  
Antiguo 21/02/2011, 07:42
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, 5 meses
Puntos: 2658
Respuesta: Un Select un poco complicado

Bueno, entonces corrige la sentencia.
Lo importante es que si lo que deseas obtener es la información de los usuarios, entonces usuarios debe ser la primera tabla del FROM y debe ser un LEFT JOIN para que te devuelva los usuarios aunque no hayan tenido cuotas.

Código MySQL:
Ver original
  1.     a.*,
  2.     COUNT(*) Pagadas
  3.     usuarios a
  4.     LEFT JOIN cuotas_usuarios c ON a.Nusuario  = c.Nusuario
  5.     INNER JOIN cuotas u ON u.Ncuota = c.Ncuota AND u.fecha = '2011'
  6.     a.Ngrupo = '1'  
  7. ORDER BY Pagadas DESC
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 21/02/2011, 07:55
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Gracias amigo por tu respuesta,

He probado la conrreccion del script y no me da ningun error, la cosa es que ahora esta mostrando solo un usuario y en la columna pagado esta mostrando el numero de cuotas en total de todos los usuarios.

Un saludo amigo y gracias por tu rrespuesta
  #10 (permalink)  
Antiguo 21/02/2011, 09:37
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Un Select un poco complicado

Una manera, aunque no muy eficiente, es esta (corrige tu mismo los posibles errores en los nombres de las columnas y demás fallos simples)

Código SQL:
Ver original
  1. SELECT *
  2. FROM
  3.     usuarios u
  4.     LEFT JOIN cuotas_usuarios c ON u.Nusuario  = c.Nusuario
  5.     INNER JOIN cuotas u ON u.Ncuota = c.Ncuota AND u.fecha = '2011'
  6. WHERE
  7.  u.Nusuario IN (SELECT Nusuario FROM
  8.     usuarios u
  9.     LEFT JOIN cuotas_usuarios c ON u.Nusuario  = c.Nusuario
  10.     INNER JOIN cuotas u ON u.Ncuota = c.Ncuota AND u.fecha = '2011'
  11.     WHERE
  12.     u.Ngrupo = '1'  
  13.     AND c.pagado = 'SI')
  14. UNION
  15. SELECT *
  16. FROM
  17.     usuarios u
  18.     LEFT JOIN cuotas_usuarios c ON u.Nusuario  = c.Nusuario
  19.     INNER JOIN cuotas u ON u.Ncuota = c.Ncuota AND u.fecha = '2011'
  20. WHERE
  21.  u.Ngrupo = '1'
  22.  AND u.Nusuario NOT IN (SELECT Nusuario FROM
  23.     usuarios u
  24.     LEFT JOIN cuotas_usuarios c ON u.Nusuario  = c.Nusuario
  25.     INNER JOIN cuotas u ON u.Ncuota = c.Ncuota AND u.fecha = '2011'
  26.     WHERE
  27.     u.Ngrupo = '1'  
  28.     AND c.pagado = 'SI')
  #11 (permalink)  
Antiguo 21/02/2011, 11:52
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Hola amigo, acabo de probar el sql cambiando los campos para los verdaderos de la tabla pero me esta indicando: Column 'Nusuario' in field list is ambiguous

Por que puede ser debido?

Un saludo colega y gracias
  #12 (permalink)  
Antiguo 22/02/2011, 02:06
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Un Select un poco complicado

En las subselect, donde pone SELECT NUsuario tienes que decir de que tabla es. Prueba esto (poniendo los nombres reales de los campos)

Código SQL:
Ver original
  1. SELECT *
  2. FROM
  3.     usuarios u
  4.     LEFT JOIN cuotas_usuarios c ON u.Nusuario  = c.Nusuario
  5.     INNER JOIN cuotas cu ON c.Ncuota = cu.Ncuota AND cu.fecha = '2011'
  6. WHERE
  7.  u.Nusuario IN (SELECT u2.Nusuario FROM
  8.     usuarios u2
  9.     LEFT JOIN cuotas_usuarios c1 ON u2.Nusuario  = c1.Nusuario
  10.     INNER JOIN cuotas cu2 ON c1.Ncuota = cu2.Ncuota AND cu2.fecha = '2011'
  11.     WHERE
  12.     u2.Ngrupo = '1'  
  13.     AND c2.pagado = 'SI')
  14. UNION
  15. SELECT *
  16. FROM
  17.     usuarios u3
  18.     LEFT JOIN cuotas_usuarios c2 ON u3.Nusuario  = c2.Nusuario
  19.     INNER JOIN cuotas cu3 ON c2.Ncuota = cu3.Ncuota AND cu3.fecha = '2011'
  20. WHERE
  21.  u3.Ngrupo = '1'
  22.  AND u3.Nusuario NOT IN (SELECT u4.Nusuario FROM
  23.     usuarios u4
  24.     LEFT JOIN cuotas_usuarios c3 ON u4.Nusuario  = c3.Nusuario
  25.     INNER JOIN cuotas cu4 ON c3.Ncuota = cu4.Ncuota AND c4u.fecha = '2011'
  26.     WHERE
  27.     u4.Ngrupo = '1'  
  28.     AND c3.pagado = 'SI')
  #13 (permalink)  
Antiguo 22/02/2011, 07:48
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Hola amigo, gracias por tu paciencia, primero darte las gracias por que esta vez si ha funcionado y llevaba un par de dias con esto cosa que se estaba ya complicando muchisimo,

por ultimo he añadido un ORDER BY c.Nusuario

para que me muestre las cuotas de cada usuario juntas si lo escribo asi funiona:


SELECT *
FROM
usuarios u
LEFT JOIN cuotas_usuarios c ON u.Nusuario = c.Nusuario
INNER JOIN cuotas cu ON c.Ncuota = cu.Ncuota AND cu.fecha = '2011'
WHERE
u.Nusuario IN (SELECT u2.Nusuario FROM
usuarios u2
LEFT JOIN cuotas_usuarios c1 ON u2.Nusuario = c1.Nusuario
INNER JOIN cuotas cu2 ON c1.Ncuota = cu2.Ncuota AND cu2.fecha = '2011'
WHERE
u2.Ngrupo = '1'
AND c1.pagado = 'si') ORDER BY c.Nusuario


pero si escribo todo el codigo:


SELECT *
FROM
usuarios u
LEFT JOIN cuotas_usuarios c ON u.Nusuario = c.Nusuario
INNER JOIN cuotas cu ON c.Ncuota = cu.Ncuota AND cu.fecha = '2011'
WHERE
u.Nusuario IN (SELECT u2.Nusuario FROM
usuarios u2
LEFT JOIN cuotas_usuarios c1 ON u2.Nusuario = c1.Nusuario
INNER JOIN cuotas cu2 ON c1.Ncuota = cu2.Ncuota AND cu2.fecha = '2011'
WHERE
u2.Ngrupo = '1'
AND c1.pagado = 'si') ORDER BY c.Nusuario
UNION
SELECT *
FROM
usuarios u3
LEFT JOIN cuotas_usuarios c2 ON u3.Nusuario = c2.Nusuario
INNER JOIN cuotas cu3 ON c2.Ncuota = cu3.Ncuota AND cu3.fecha = '2011'
WHERE
u3.Ngrupo = '1'
AND u3.Nusuario NOT IN (SELECT u4.Nusuario FROM
usuarios u4
LEFT JOIN cuotas_usuarios c3 ON u4.Nusuario = c3.Nusuario
INNER JOIN cuotas cu4 ON c3.Ncuota = cu4.Ncuota AND cu4.fecha = '2011'
WHERE
u4.Ngrupo = '1'
AND c3.pagado = 'si')

da el error: Incorrect usage of UNION and ORDER BY

creo que sera por que no estoy poniendo el order by en su sitio,

De nuevo darte las gracias por tu paciencia y por tu ayuda, llevo unos dias con esto y ya casi lo daba por perdido, gracias desde ya colega

Última edición por franjgg; 22/02/2011 a las 08:42
  #14 (permalink)  
Antiguo 22/02/2011, 09:03
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Un Select un poco complicado

El ORDER BY lo tienes que poner al final, para que afecte a toda la UNION, pero entonces no quedarán los que tienen alguna cuota pagada al principio y los que no tienen ninguna al final.

Una solución que se me ocurre, pero no se si funciona, es que en el primer SELECT añadas una columna que muestre un 1 y en el segundo un 2 y ordenes por ese campo antes que por id de usuario. Algo así (pero ya te digo que no estoy seguro que funcione)

Código SQL:
Ver original
  1. SELECT *, 1 AS b
  2. FROM
  3. usuarios u
  4. LEFT JOIN cuotas_usuarios c ON u.Nusuario = c.Nusuario
  5. INNER JOIN cuotas cu ON c.Ncuota = cu.Ncuota AND cu.fecha = '2011'
  6. WHERE
  7. u.Nusuario IN (SELECT u2.Nusuario FROM
  8. usuarios u2
  9. LEFT JOIN cuotas_usuarios c1 ON u2.Nusuario = c1.Nusuario
  10. INNER JOIN cuotas cu2 ON c1.Ncuota = cu2.Ncuota AND cu2.fecha = '2011'
  11. WHERE
  12. u2.Ngrupo = '1'
  13. AND c1.pagado = 'si')
  14. UNION
  15. SELECT *, 2 AS b
  16. FROM
  17. usuarios u3
  18. LEFT JOIN cuotas_usuarios c2 ON u3.Nusuario = c2.Nusuario
  19. INNER JOIN cuotas cu3 ON c2.Ncuota = cu3.Ncuota AND cu3.fecha = '2011'
  20. WHERE
  21. u3.Ngrupo = '1'
  22. AND u3.Nusuario NOT IN (SELECT u4.Nusuario FROM
  23. usuarios u4
  24. LEFT JOIN cuotas_usuarios c3 ON u4.Nusuario = c3.Nusuario
  25. INNER JOIN cuotas cu4 ON c3.Ncuota = cu4.Ncuota AND cu4.fecha = '2011'
  26. WHERE
  27. u4.Ngrupo = '1'
  28. AND c3.pagado = 'si')
  29. ORDER BY b, c.Nusuario
  #15 (permalink)  
Antiguo 22/02/2011, 12:16
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Hola amigo, parece que si funciona la idea de las columnas los esta emparejando bien lo que me sale es un error en el: c.Nusuario

Unknown column 'c.Nusuario' in 'order clause'

como si no identificase ese criterio de ordenacion. he probado a cambiarlo por u.Nusuario y demas pero dice lo mismo.

Si pruebo a poner el c.Nusuario en cada una de las dos partes de la union y ejecuto cada union por separado funciona bien pero las dos partes de la union juntas arroja el error


Un saludo y mil gracias amigo

Última edición por franjgg; 22/02/2011 a las 14:50
  #16 (permalink)  
Antiguo 23/02/2011, 02:10
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Un Select un poco complicado

Pon el número de columna que es c.Nusuario, así seguramente te funcione. Si en el resultado Nusuario es la primera columna que te sale pon

ORDER BY b, 1

Si es la segunda columna

ORDER BY b, 2

Prueba eso. Si lo ejecutas por separado funciona pero con el UNION el ORDER BY tiene que ir al final y aplicar a toda la tabla.
  #17 (permalink)  
Antiguo 23/02/2011, 07:25
 
Fecha de Ingreso: marzo-2007
Mensajes: 751
Antigüedad: 17 años, 1 mes
Puntos: 4
Respuesta: Un Select un poco complicado

Hola amigo, por fin esta funcionando, te doi mil gracias por tu ayuda, ya estaba pensando un metodo para mostrar las dos consultas por separado, pero ahora esta fucionando perfectamente.

Darte de nuevo las gracias por que me ha ayudado enormemente, eres un fenomeno amigo.

remil Gracias

Etiquetas: select
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 10:50.