Bases de Datos - Varias condiciones de Busqueda sobre 1 mismo campo

 
Vista:

Varias condiciones de Busqueda sobre 1 mismo campo

Publicado por Gabriel Castillo (2 intervenciones) el 23/10/2008 15:00:17
Que mas a todos, necesito un Favor urgente!!!! Necesito hacer varias busquedas sobre una misma tabla pero con condiciones contradictorias, es asi:

idres idpre respuesta idusu
1 1 3 2
2 6 M 2
3 6 F 5
4 10 1 2
6 6 M 7

Tengo esta tabla, que consta de 4 campos que son el idRespuesta, idPregunta, respuesta y idUsuario. Lo que quiero hacer es buscar que usuarios respondieron de cierta forma a diferentes preguntas, pueden ser N.
Entonces por ejemplo, que usuarios respondieron M a la pregunta 6 y a la vez que usuarios respondieron 1 a la pregunta 10. En ese caso la consulta me deberia arrojar el usuario 2, por que fue el unico que respondio como yo queria. El prolema es q no tengo idea de como hacerlo. Eso si, tiene que ser eficiente por que la tabla puede contener mas de 300.000 registros. Muchas gracias a los que me peudan ayudar!!!

Ahhhh una cosa, es en SQL Server.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Varias condiciones de Busqueda sobre 1 mismo ca

Publicado por Franklin Gamboa (188 intervenciones) el 30/10/2008 14:18:09
Hola,

La forma mas practica de resolver este problema es usando un IN en el where para comparar el atributo multivaluado respuesta.

La otra forma es usando unions y un select diferente para cada respuesta... de modo que si tienes 20 respuestas por consultar, tendrías 20 selects unidos por un union, de mas está decir que no es viable.

Entonces, el query sería algo así:

Select idusu, respuesta
from respuestas
where respuesta in ( 'Condicion1 ','Condicion2', 'CondicinN')
group by respuesta

QUe tan eficiente sea esta consulta dependerá mas de la configuración de tu SQL Server que de la consulta en si, si crees que puede ser lenta debes agregar un indice por el campo respuesta.

Saludos,

Franklin Gamboa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Varias condiciones de Busqueda sobre 1 mismo ca

Publicado por Gabriel Castillo (2 intervenciones) el 30/10/2008 15:45:49
Como está, le agradezco su ayuda, pero no, asi no me funciona, Si quisiera la respuesta ha una sola pregunta si es muy facil, pero es que quiero las respuestas sobre varias preguntas.

Un where simple seria asi:

select idusuario from respuestas where idpregunta=6 and respuesta = 'M'

Eso me devolveria estos dos registros:

idusu
2
7

pero lo que yo quiero es tener los usuarios que aparte de esa pregunta correcta me respondieron otra, hasta N preguntas

select idusuario from respuestas where
idpregunta=6 and respuesta = 'M'
and idpregunta=1 and respuesta = 3

Eso ya no me traeria nada, y no me sirve el union, porque si hago un union por pregunta me traeria registros que no me sirven de nada, ej:

select idusuario from respuestas where
idpregunta=6 and respuesta = 'M'

union

select idusuario from respuestas where
idpregunta=1 and respuesta = 3

eso me traeria :

idusu
2
7

sabiendo que el usuario 7 no contesto la pregunta 1.

Y un where in tampoco me sirve, por que solo me evalua sobre un campo.

Le agradeceria su ayuda, ya estoy loco con esto!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Varias condiciones de Busqueda sobre 1 mismo ca

Publicado por Franklin Gamboa (188 intervenciones) el 04/11/2008 01:09:16
Buenas Gabriel,

Creo que ya te entendi, lo que ocupas no solo es saber quien contestó una pregunta, sino tambien quien contestó otra pregunta

Hay dos maneras de hacerlo, la "facil" y la dificil, empecemos por la facil.

La facil consiste en modificar la estructura de esa tabla y poner un campo tipo bit que indique si la resspuesta fue contestada correctamente por el usuario o no, un procedimiento que puede ser el mismo que ingresa los valores a esta tabla q se encargue de dicha validación y de cargar los datos de este campo y el siguiente select:

Select idusu, respuesta
from respuestas
where idpre in (1,6)
and esCorrecta = true

Con eso te abstraes de que el select tenga que validar si la respuesta es correcta o no, si alguien no contestó alguna de las dos correctamente entonces no cumplirá la clausula esCorrecta.

La dificil (que no es tan dificil sino que crecerá si conforme ocupes mas preguntas, porlo que es impractica) es hacer inner joins a la misma tabla para obtener los valores que se repiten, de esta manera:

select *
from respuesta a INNER JOIN respuesta b ON a.idusu = b.idusu
where b.respuesta = 'F'
and b.idpre = 6
and a.respuesta = '3'
and a.idpre = 1

Esta consulta te devolverá estrictamente los usuarios que hayan respondido a todas las preguntas que plantees en el query, pero como te dije, darle mantenimiento y meter mas preguntas/respuestas se va a volver muy tedioso y, con el tiempo poco natural tambien, por ende recomiendo mas la primera respuesta.

Espero haberte ayudado.

Saludos,

Franklin Gamboa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar