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

Consulta que se resiste...

Estas en el tema de Consulta que se resiste... en el foro de Mysql en Foros del Web. Buenas, en este mi primer mensaje os solicito ayuda con una consulta que se me ha atravesado y no hay forma. Es sobre dos tablas ...
  #1 (permalink)  
Antiguo 03/12/2008, 16:33
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Consulta que se resiste...

Buenas,

en este mi primer mensaje os solicito ayuda con una consulta que se me ha atravesado y no hay forma. Es sobre dos tablas que tienen la siguiente forma:

tabla A:
-idinscrito
-nombre
-email

tabla B:
-idcuota
-idinscrito
-cuota (corresponde al año. 2006, 2007, 2008,...)
-pagado (si o no)

tabla B seria por ej:
1 21 2006 S
2 21 2007 N
3 21 2008 N
4 14 2005 S
5 14 2006 S
6 14 2007 S
7 14 2008 N

la consulta que pretendo es para obtener la gente que tiene cuota=2008 y Pagado=N, pero ojo, que solo deban cuota=2008 ( 2007 pagada=si).....

Creo que no es tan complicada, pero llevo atrancado un rato y no hay forma..

Espero puedan ayudarme.


GRACIAS
  #2 (permalink)  
Antiguo 03/12/2008, 21:28
Avatar de happy1783  
Fecha de Ingreso: mayo-2008
Ubicación: Bogotá
Mensajes: 146
Antigüedad: 15 años, 11 meses
Puntos: 1
Respuesta: Consulta que se resiste...

Hola eltodi, bienvenido al foro.

muestranos como estas haciendo la consulta, no pretenderas que te la hagamos nosotros.
__________________
El hombre sabio vive actuando no pensando en actuar.
  #3 (permalink)  
Antiguo 04/12/2008, 02:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta que se resiste...

Cita:
Iniciado por eltodi Ver Mensaje
Buenas,

en este mi primer mensaje os solicito ayuda con una consulta que se me ha atravesado y no hay forma. Es sobre dos tablas que tienen la siguiente forma:

tabla A:
-idinscrito
-nombre
-email

tabla B:
-idcuota
-idinscrito
-cuota (corresponde al año. 2006, 2007, 2008,...)
-pagado (si o no)

tabla B seria por ej:
1 21 2006 S
2 21 2007 N
3 21 2008 N
4 14 2005 S
5 14 2006 S
6 14 2007 S
7 14 2008 N

la consulta que pretendo es para obtener la gente que tiene cuota=2008 y Pagado=N, pero ojo, que solo deban cuota=2008 ( 2007 pagada=si).....

Creo que no es tan complicada, pero llevo atrancado un rato y no hay forma..

Espero puedan ayudarme.


GRACIAS
Prueba esta consulta, pero revisa antes los nombres de los campos y demás

Código sql:
Ver original
  1. SELECT tablaA.idinscrito, tablaA.nombre, COUNT( * ) AS total
  2. FROM `tablaB`
  3. INNER JOIN tablaA ON tablaA.idinscrito= tablaB.idinscrito
  4. WHERE (tablaB.cuota = '2007'
  5. AND tablaB.pagado = 'S')
  6. OR (tablaB.cuota = '2008'
  7. AND tablaB.pagado = 'N')
  8. GROUP BY tablaB.idinscrito
  9. HAVING total =2

Te explico el método: buscas todos los que tienen pagado 2007 y sin pagar 2008. Luego agrupas por idinscrito y sacas la cuenta. Aquellos que devuelvan un total de dos, es que cumplen ambas condiciones en una sola persona. Esta es una consulta que ciertamente causa más de un problema y hace dudar a los que nos iniciamos en bases de datos sobre la bondad de una estructura relacional tal y como la hemos aprendido, porque pensamos que resultaría más fácil si los datos de los años estuvieran en un mismo registro, pero es un error entenderlo así, al menos esa es mi opinión, porque la estructura que tienes es la correcta, a pesar de esta pequeña dificultad.

Última edición por jurena; 04/12/2008 a las 03:38
  #4 (permalink)  
Antiguo 04/12/2008, 04:39
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Consulta que se resiste...

Mil gracias por tu ayuda, la consulta ha funcionado perfecta, aunque me cuesta algo entenderla..

Yo lo primero que trataba de obtener es el numero de personas que deben 2008 y tienen 2007 pagado, para esto hacia:

select * from `tablaB` where
(tablaB.cuota='2007' and tablaB.pagado='S') and
(tablaB.cuota='2008' and tablaB.pagado='N')

pero no me devuelve nada la consulta, debe tener algo mal seguro...

Es cierto que esta estructura de la tabla es algo complicado para hacer consultas, no se porqué la harían así desde un principio

Gracias de nuevo.
  #5 (permalink)  
Antiguo 04/12/2008, 05:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta que se resiste...

Al contrario de lo que piensas, la estructura de la tabla está bien, es perfecta. La dificultad es de esta consulta concreta. Analiza tu consulta: si buscas un registro en el que el 2007 esté pagado y el 2008 sin pagar, no encontrarás ninguno, pues en ninguno se dan a la vez ambos supuestos. Es decir, puede encontrar uno que en 2007 esté pagado, pero ese mismo registro no estará sin pagar en 2008, puesto que sólo tiene el dato de 2007. Tienes que buscar con OR para que te traiga ambos, luego agrupar por persona y si el total de esos en una persona es dos, es que tienes a la persona que buscas.
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 20:07.