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

consulta mysql.. sencilla pero no me sale :S

Estas en el tema de consulta mysql.. sencilla pero no me sale :S en el foro de Mysql en Foros del Web. Hola, asi tengo las tablas: ENCUESTAS: idEncuesta nombreEncuesta ... PREGUNTAS: idPregunta idEncuesta ... RESPUESTASPOSIBLES: respuestaId preguntaId ... RESPUESTASFINALES: idReFinal idRePosible idUsuario ... y otra tabla ...
  #1 (permalink)  
Antiguo 16/06/2008, 02:38
 
Fecha de Ingreso: marzo-2008
Mensajes: 31
Antigüedad: 16 años, 1 mes
Puntos: 0
consulta mysql.. sencilla pero no me sale :S

Hola, asi tengo las tablas:

ENCUESTAS:
idEncuesta
nombreEncuesta
...

PREGUNTAS:
idPregunta
idEncuesta

...

RESPUESTASPOSIBLES:
respuestaId
preguntaId

...

RESPUESTASFINALES:
idReFinal
idRePosible
idUsuario

...

y otra tabla USUARIOS:
idUsuario

username
...

Quiero seleccionar los campos de "encuestas" donde idUsuario de la tabla "respuestasfinales" no sea igual a 'x', que es un int como por ejemplo 1.

Es decir, conseguir las encuestas, en las que cierto usuario aun no haya realizado ninguna respuesta final.

He intentado lo siguiente:

SELECT e.idEncuesta
FROM encuestas e, preguntas p,respuestasposibles rp, respuestasfinales rf
where e.idEncuesta=p.idEncuesta
and p.idPregunta=rp.preguntaId
and rp.respuestaId = rf.idRePosible
and rf.idUsuario = '1';

y esta consulta me devuelve las que ha REALIZADO, pero quiero las que aun le quedan por hacer, es decir:

[ENCUESTAS] - [ENCUESTAS REALIZADAS] = [ ENCUESTAS QUE FALTAN POR HACER A ESE USUARIO]

si en la ultima linea hago: and rf.idUsuario != '1';
no me sale.. devuelve encuestas pero no lo que quiero/deberia.

Imagino que no debe ser muy complicado.. es hacer esa resta de subconjuntos, pero no me acuerdo como podria hacerlo..

ayuda por favor. Gracias :)
  #2 (permalink)  
Antiguo 16/06/2008, 03:10
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: consulta mysql.. sencilla pero no me sale :S

Y si pones

rf.idUsuario = NULL; o ISNULL(rf.idUsuario);

Si no te sale, quizás debas utilizar el comando LEFT JOIN para relacionar las tablas. De este modo, seguro que te pone los rf.idUsuario a NULL en la consulta.

Un saludo
  #3 (permalink)  
Antiguo 16/06/2008, 03:29
 
Fecha de Ingreso: marzo-2008
Mensajes: 31
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: consulta mysql.. sencilla pero no me sale :S

Hola!

gracias por responder.

Creo que necesito hacer un left join, para hacer la resta y quedarme con las encuestas donde rf.idUsuario != '1'..

alguna ayudita ?
  #4 (permalink)  
Antiguo 16/06/2008, 04:08
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: consulta mysql.. sencilla pero no me sale :S

El left join iría así
Código:
SELECT e.idEncuesta
FROM encuestas e LEFT JOIN preguntas p ON e.idEncuesta=p.idEncuesta 
LEFT JOIN respuestasposibles rp ON p.idPregunta=rp.preguntaId 
LEFT JOIN respuestasfinales rf ON rp.respuestaId = rf.idRePosible 
where rf.idUsuario = NULL;
Eso de hacer la resta no sé si se puede hacer.
  #5 (permalink)  
Antiguo 16/06/2008, 11:09
 
Fecha de Ingreso: marzo-2008
Mensajes: 31
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: consulta mysql.. sencilla pero no me sale :S

la virgen..
ya lo conseguí:

Código:
SELECT en.idEncuesta
FROM encuestas en 
WHERE en.idEncuesta NOT IN (SELECT distinct e.idEncuesta
FROM encuestas e 
LEFT JOIN preguntas p ON e.idEncuesta=p.idEncuesta
LEFT JOIN respuestasposibles rp ON p.idPregunta=rp.preguntaId
LEFT JOIN respuestasfinales rf ON rp.respuestaId = rf.idRePosible
WHERE rf.idUsuario = '2');
llevo un dia cojonudo con esta consultita y una funcion de javascript para comprobar checkbox dinámicos.

cuando no salen las cosas te vuelves tarumba :( .. pero cuando salen q felicidad :)

Gracias jerkan, me serviste de gran ayuda.
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 11:39.