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

[SOLUCIONADO] Problema con consulta en mysql

Estas en el tema de Problema con consulta en mysql en el foro de Mysql en Foros del Web. Tengo la siguiente consulta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original SELECT materia , especialidad , idmateria , `esc_cal_planes` . idespecialidad AS idesp , `esc_cal_planes` . ...
  #1 (permalink)  
Antiguo 21/08/2015, 08:38
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 8 años, 10 meses
Puntos: 0
Pregunta Problema con consulta en mysql

Tengo la siguiente consulta:

Código SQL:
Ver original
  1. SELECT materia,especialidad,idmateria,`esc_cal_planes`.idespecialidad AS idesp,`esc_cal_planes`.idplan AS idplan  FROM siin_control_escolar.`esc_cal_planes`
  2. INNER JOIN siin_control_escolar.`esc_especialidades`
  3. ON
  4. siin_control_escolar.`esc_especialidades`.idespecialidad=siin_control_escolar.`esc_cal_planes`.idespecialidad
  5. AND
  6. siin_control_escolar.`esc_cal_planes`.idcarrera= 6
  7. WHERE siin_control_escolar.`esc_cal_planes`.`IDCARRERA` = 6   AND siin_control_escolar.`esc_cal_planes`.`MATERIA` LIKE '%frances%' OR siin_control_escolar.`esc_cal_planes`.`MATERIA` LIKE '%ingles%'AND siin_control_escolar.`esc_cal_planes`.`ACTIVO` = 1 AND siin_control_escolar.`esc_cal_planes`.`CUATRIMESTRE` = 1
  8. GROUP BY(idmateria) ORDER BY(materia)

el problema es que no me respeta lo de cuatrimestre es = 1

todo empezo cuando le agrege el like

Me pueden dar una orientada de que puede estar fallando gracias de antemano
__________________
VENIMOS A APRENDER
  #2 (permalink)  
Antiguo 21/08/2015, 09:59
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: Problema con consulta en mysql

Cita:
el problema es que no me respeta lo de cuatrimestre es = 1
Muestranos la tabla resultado donde se vea que no respeta esa condición.
Lo que dices no alcanza para analizar el tema. No tenemos tus datos ni tus tablas, pero en principio, la condición es mandatoria, por lo que no puede excluirla de ninguna forma.
__________________
¿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 21/08/2015, 10:12
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Problema con consulta en mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Muestranos la tabla resultado donde se vea que no respeta esa condición.
Lo que dices no alcanza para analizar el tema. No tenemos tus datos ni tus tablas, pero en principio, la condición es mandatoria, por lo que no puede excluirla de ninguna forma.
resultados



aqui checamos un id de la tabla de resultados y se nota claramente que no respeto el cuatrimestre


Que estara fallando?

en teoria tendria que mostrar solo ingles
__________________
VENIMOS A APRENDER
  #4 (permalink)  
Antiguo 21/08/2015, 10:28
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: Problema con consulta en mysql

Tu problema es que no estás comprendiendo el compotamiento de los operadores lógicos OR y AND. Estás olvidando los principios básicos de Lógica Proposicional. POr eso tu consulta termina realizando dos busquedas basadas en un set diferente de condiciones en cada caso.
OR es una disyunción, mientras que AND es una conjunción, esto implica que AND obliga al cumplimiento de las dos condiciones que separa, pero OR considera separadamente cada una, y devuelve todos los casos donde se de una u otra... o ambas a la vez.
Así de simple.

Si pongo tu query simplificada (por favor, aprende a usar los alias), la cosa sería esta:
Código MySQL:
Ver original
  1.     ES.materia,
  2.     ES.especialidad,
  3.     ES.idmateria,
  4.     CP.idespecialidad  idesp,
  5.     CP.idplan idplan
  6.     siin_control_escolar.`esc_cal_planes` CP
  7.         INNER JOIN
  8.     siin_control_escolar.`esc_especialidades` ES ON
  9.         ES.idespecialidad = ES.idespecialidad
  10.     CP.`IDCARRERA` = 6
  11.         AND CP.`MATERIA` LIKE '%frances%'
  12.         OR CP.`MATERIA` LIKE '%ingles%'
  13.         AND CP.`ACTIVO` = 1
  14.         AND CP.`CUATRIMESTRE` = 1
  15. GROUP BY idmateria
  16. ORDER BY materia;

Ahora bien, el WHERE contiene dos sets de condiciones, como te dije.
Este es uno:
Código MySQL:
Ver original
  1. CP.`IDCARRERA` = 6
  2.         AND CP.`MATERIA` LIKE '%frances%'
Y este es otro:
Código MySQL:
Ver original
  1. CP.`MATERIA` LIKE '%ingles%')
  2.         AND CP.`ACTIVO` = 1
  3.         AND CP.`CUATRIMESTRE` = 1

Para que puedas evaluar como una sola condicion la materia en "MATERIA", ambas condiciones unidas por el OR deben quedar contenidas entre paréntesis:
Código MySQL:
Ver original
  1.     ES.materia,
  2.     ES.especialidad,
  3.     ES.idmateria,
  4.     CP.idespecialidad  idesp,
  5.     CP.idplan idplan
  6.     siin_control_escolar.`esc_cal_planes` CP
  7.         INNER JOIN
  8.     siin_control_escolar.`esc_especialidades` ES ON
  9.         ES.idespecialidad = ES.idespecialidad
  10.     CP.`IDCARRERA` = 6
  11.         AND (CP.`MATERIA` LIKE '%frances%'
  12.         OR CP.`MATERIA` LIKE '%ingles%')
  13.         AND CP.`ACTIVO` = 1
  14.         AND CP.`CUATRIMESTRE` = 1
  15. GROUP BY idmateria
  16. ORDER BY materia;

Así SI, la base resuelve esas dos condiciones como una sola, y luego resuelve la resultante en funcion de las otras.

¿Se entiende?

Posdata: Quité el "idcarrera= 6" del FROM porque era redundante, ya que la misma condición la estabas poniendo en el WHERE. No necesita ir en ambas partes...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/08/2015 a las 11:23
  #5 (permalink)  
Antiguo 21/08/2015, 10:40
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 8 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Problema con consulta en mysql

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tu problema es que no estás comprendiendo el compotamiento de los operadores lógicos OR y AND. Estás olvidando los principios básicos de Lógica Proposicional. POr eso tu consulta termina realizando dos busquedas basadas en un set diferente de condiciones en cada caso.
OR es una disyunción, mientras que AND es una conjunción, esto implica que AND obliga al cumplimiento de las dos condiciones que separa, pero OR considera separadamente cada una, y devuelve todos los casos donde se de una u otra... o ambas a la vez.
Así de simple.

Si pongo tu query simplificada (por favor, aprende a usar los alias), la cosa sería esta:
Código MySQL:
Ver original
  1.     ES.materia,
  2.     ES.especialidad,
  3.     ES.idmateria,
  4.     CP.idespecialidad  idesp,
  5.     CP.idplan idplan
  6.     siin_control_escolar.`esc_cal_planes` CP
  7.         INNER JOIN
  8.     siin_control_escolar.`esc_especialidades` ES ON
  9.         ES.idespecialidad = ES.idespecialidad
  10.     CP.`IDCARRERA` = 6
  11.         AND CP.`MATERIA` LIKE '%frances%'
  12.         OR CP.`MATERIA` LIKE '%ingles%'
  13.         AND CP.`ACTIVO` = 1
  14.         AND CP.`CUATRIMESTRE` = 1
  15. GROUP BY idmateria
  16. ORDER BY materia;

Ahora bien, el WHERE contiene dos sets de condiciones, como te dije.
Este es uno:
Código MySQL:
Ver original
  1. CP.`IDCARRERA` = 6
  2.         AND CP.`MATERIA` LIKE '%frances%'
Y este es otro:
Código MySQL:
Ver original
  1. CP.`MATERIA` LIKE '%ingles%')
  2.         AND CP.`ACTIVO` = 1
  3.         AND CP.`CUATRIMESTRE` = 1

Para que puedas evaluar como una sola condicion la materia en "MATERIA", ambas condiciones unidas por el OR deben quedar contenidas entre paréntesis:
Código MySQL:
Ver original
  1.     ES.materia,
  2.     ES.especialidad,
  3.     ES.idmateria,
  4.     CP.idespecialidad  idesp,
  5.     CP.idplan idplan
  6.     siin_control_escolar.`esc_cal_planes` CP
  7.         INNER JOIN
  8.     siin_control_escolar.`esc_especialidades` ES ON
  9.         ES.idespecialidad = ES.idespecialidad
  10.     CP.`IDCARRERA` = 6
  11.         AND (CP.`MATERIA` LIKE '%frances%'
  12.         OR CP.`MATERIA` LIKE '%ingles%')
  13.         AND CP.`ACTIVO` = 1
  14.         AND CP.`CUATRIMESTRE` = 1
  15. GROUP BY idmateria
  16. ORDER BY materia;

Así SI, la base resuelve esas dos condiciones como una sola, y luego resuelve la resultante en funcion de las otras.

¿Se entiende?

Posdata: Quité el "idcarrera= 6" del FROM porque era redundante, ya que la misma condición la estabas poniendo en el WHERE. No necesita ir en ambas partes...
Gracias amigo ya funciono la consulta y te hare caso con lo de los alias, la verdad soy flojo para ponerles otros nombres pero si esta mejor el codigo simplificado
Hoy aprendi algo nuevo gracias de nuevo saludos y que DTB
__________________
VENIMOS A APRENDER

Última edición por gnzsoloyo; 21/08/2015 a las 11:24

Etiquetas: bases-de-datos-general, 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 08:43.