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

[SOLUCIONADO] consulta sql con varios AND/OR

Estas en el tema de consulta sql con varios AND/OR en el foro de Mysql en Foros del Web. Hola amigos mi pregunta es como puede uno agrupar los and y los or en las consultas sql la consulta es la siguiente @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 16/01/2014, 17:26
 
Fecha de Ingreso: diciembre-2012
Mensajes: 249
Antigüedad: 11 años, 4 meses
Puntos: 2
consulta sql con varios AND/OR

Hola amigos mi pregunta es como puede uno agrupar los and y los or en las consultas sql
la consulta es la siguiente


Código MySQL:
Ver original
  1. SELECT inscripciones.IdInscripcion,inscripciones.IdStatus
  2. FROM inscripciones,estatus
  3. WHERE inscripciones.Temporal='D'
  4. AND inscripciones.IdEvento=1
  5. AND (inscripciones.idstatus="" or estatus.IdOptionStatus between 4 AND 7);


necesito que se cumplan las 4 primeras lineas sin ninguna excepcion pero que ademas se ejecute una de las 2 sentencias dentro del parentesis
pero en realizad este no me funciona porque me esta botando registros q solo cumplen las 4 primeras lineas, alguna idea??
gracias
  #2 (permalink)  
Antiguo 16/01/2014, 17:49
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: consulta sql con varios AND/OR

Cita:
alguna idea??
Si: tienes un problema de datos o de lógica.
Por empezar, no hables de "4 primeras lineas" eso es incorrecto. Lo que importa es que se cumplan las condiciones del WHERE. Las otras son parte de la consulta, las condiciones de una consulta aplican pura y exclusivamente sobre el WHERE... siempre.

Bien, yendo al problema:

Código SQL:
Ver original
  1. SELECT I.IdInscripcion, I.IdStatus
  2. FROM inscripciones I , estatus E
  3. WHERE
  4.     I.Temporal='D'
  5.     AND I.IdEvento=1
  6.     AND (I.idstatus="" OR E.IdOptionStatus BETWEEN 4 AND 7);
Esta consulta es un espanto de ineficiencia e incorrección.
Si las dos tablas no tienen un campo en en común, con exactamente el mismo nombre, estarías creando un producto cartesiano, con lo que forzosamente debe devolverte registros, ya que mezcla todo lo de la primera tabla con todo lo de la segunda. Porque simplemente siempre habrá al menos un registro, en toda esa mezcla que coincida en alguna cosa.

Para realizar un JOIN debes indicar el campo que los relaciona. Supongamos:
Código SQL:
Ver original
  1. SELECT I.IdInscripcion, I.IdStatus
  2. FROM inscripciones I INNER JOIN estatus E ON I.idstatus = E.idstatus;
Luego, además hay que asegurarse de que las condiciones se cumplen. pero en un JOIN donde relacionas ambas tablas por el IDSTATUS, ese valor forzosamente debe existir, por ende no debería haber un campo de la primera tabla que tenga cero o esté vacío:
Código SQL:
Ver original
  1. SELECT I.IdInscripcion, I.IdStatus
  2. FROM inscripciones I INNER JOIN estatus E ON I.idstatus = E.idstatus
  3. WHERE
  4.     I.Temporal='D'
  5.     AND I.IdEvento=1
  6.     AND E.IdOptionStatus BETWEEN 4 AND 7;
Si la idea es que te devuelva inscripciones, aunque no existan estados relacionados, todo lo que hiciste está mal de entrada:
Código SQL:
Ver original
  1. SELECT I.IdInscripcion, I.IdStatus
  2. FROM inscripciones I LEFT JOIN estatus E ON I.idstatus = E.idstatus
  3. WHERE
  4.     I.Temporal='D'
  5.     AND I.IdEvento=1
  6.     AND (E.IdOptionStatus BETWEEN 4 AND 7 OR E.idstatus IS NULL);

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/01/2014, 20:56
 
Fecha de Ingreso: diciembre-2012
Mensajes: 249
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: consulta sql con varios AND/OR

hay si tienes toda la razon creo q se me bloqueo el coco mientras posteaba eso, y no me di cuenta que me faltaba la parte de I.idstatus = E.idstatus, lo siento me habia confundido bobamente, muchas gracias ^^

Etiquetas: registro, select, sql
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 05:44.