Ver Mensaje Individual
  #5 (permalink)  
Antiguo 21/08/2015, 10:40
VALFONSOG
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 9 años, 8 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