Ver Mensaje Individual
  #4 (permalink)  
Antiguo 21/08/2015, 10:28
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 3 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