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

[SOLUCIONADO] Problema con OR y AND

Estas en el tema de Problema con OR y AND en el foro de Mysql en Foros del Web. Hola Estoy desarrollando un sitio de figuras de acción donde cada figura posee una linea distinta. Ahora intento realizar un sistema de noticias que a ...
  #1 (permalink)  
Antiguo 25/08/2013, 18:26
Myl
 
Fecha de Ingreso: agosto-2011
Mensajes: 61
Antigüedad: 12 años, 8 meses
Puntos: 3
Problema con OR y AND

Hola

Estoy desarrollando un sitio de figuras de acción donde cada figura posee una linea distinta. Ahora intento realizar un sistema de noticias que a su vez me relacione cada noticia con una respectiva figura. Y me ha resultado.

Tengo las siguientes tablas:
Código MySQL:
Ver original
  1. CREATE TABLE linea (
  2.     idLinea INT AUTO_INCREMENT NOT NULL,
  3.     nombreLinea VARCHAR(40) NOT NULL,
  4.     PRIMARY KEY (idLinea)
  5. )ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

Código MySQL:
Ver original
  1. CREATE TABLE noticia (
  2.     idNoticia INT AUTO_INCREMENT NOT NULL,
  3.     idFigura INT NOT NULL,
  4.     fecha INT NOT NULL,
  5.     idUsuario INT NOT NULL,
  6.     relacion BOOLEAN NOT NULL,
  7.     urlImagen VARCHAR(100) NOT NULL,
  8.     titulo VARCHAR(80) NOT NULL,
  9.     subTitulo VARCHAR(250) NOT NULL,
  10.     cuerpo TEXT NOT NULL,
  11.     PRIMARY KEY(idNoticia)
  12. )Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
  13.  
  14. ALTER TABLE noticia ADD CONSTRAINT FK_idFigura_N
  15. FOREIGN KEY (idFigura) REFERENCES figura (idFigura);

Código MySQL:
Ver original
  1. CREATE TABLE figura (
  2.     idFigura INT AUTO_INCREMENT NOT NULL,
  3.     imgFigura VARCHAR(60) NOT NULL,
  4.     imgFiguraLista VARCHAR(60) NOT NULL,
  5.     idLinea INT NOT NULL,
  6.     fechaLanzamiento DATE,
  7.     precio INT,
  8.     idTipoCuerpo INT NOT NULL,
  9.     nombreFigura VARCHAR(40) NOT NULL,
  10.     descripcion TEXT,
  11.     PRIMARY KEY (idFigura)
  12. )Engine=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
  13.  
  14. ALTER TABLE figura ADD CONSTRAINT FK_idLineaF
  15. FOREIGN KEY (idLinea) REFERENCES linea (idLinea);

El problema que tengo es que al hacer una consulta como esta:

Código MySQL:
Ver original
  1. SELECT n.idNoticia, n.titulo, n.urlImagen, n.subTitulo, n.fecha FROM noticia n INNER JOIN figura f ON n.idFigura = f.idFigura
  2. WHERE n.idFigura = ?
  3. AND n.relacion = TRUE
  4. AND n.idNoticia != ?
  5. OR f.idLinea = ?

No respeta las clausulas
AND n.relacion = TRUE
AND n.idNoticia != ?


Todo esto supongo que es por la clausula OR f.idLinea = ? donde trae todo lo relacionado con la figura y la linea de la figura aun cuando le diga que ciertas noticias no deben ser mostradas o que el atriburo relacion, debe tener un valir especifico. ¿Hay alguna forma de "obligar" a MySQL a que respetas tales clausulas?.

Podria arreglar este problema del codigo, podria simplementer hacer un if mientras hago el fetch de la consulta, pero no es la idea.

Podria alguien ayudarme por favor?

Última edición por gnzsoloyo; 25/08/2013 a las 19:35 Razón: Completamente mal etiquetado.
  #2 (permalink)  
Antiguo 25/08/2013, 19:33
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, 4 meses
Puntos: 2658
Respuesta: Problema con OR y AND

Cita:
No respeta las clausulas
AND n.relacion = TRUE
AND n.idNoticia != ?
Estás en un completo error. El problema no es que MySQL "no respeta", sino que las cláusulas están mal construidas.
Esto es lógica proposicional, y un OR es una disyunción, que "quiebra" un conjunto de cláusulas, en dos, ya que un OR es TRUE si al menos una de las dos partes es verdad.
En otras palabras, todas las cláusulas son mandatorias (deben sí o si ser TRUE), pero cuando pones el OR en esas condiciones, con sólo que se cumpla "f.idLinea = ?" alcanza.
En otras palabras, el "f.idLinea = ? " debe ser parte de otra condición y estar encerrada entre paréntesis.
Por ejemplo:
Código MySQL:
Ver original
  1. SELECT n.idNoticia, n.titulo, n.urlImagen, n.subTitulo, n.fecha
  2. FROM noticia n INNER JOIN figura f ON n.idFigura = f.idFigura
  3. WHERE (n.idFigura = ?  OR f.idLinea = ? )
  4. AND n.relacion = TRUE
  5. AND n.idNoticia != ?
En ese contexto, idfigura debe ser igual a un valor pasado por parámetro, relacion ser TRUE y luego o bien idNoticia es igual a algun parámetro, o idLinea igual a otro, o bien ambos son TRUE.

¿Se entiende?

Ten en cuenta siempre, que los DBMS no cometen errores. Si las clasulas no parecen cumplirse, no es problema del DBMS, es que el programador no está haciendo la consulta correctamente, o bien no hay datos en la base que cumplan con lo pedido.
__________________
¿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 25/08/2013, 21:07
Myl
 
Fecha de Ingreso: agosto-2011
Mensajes: 61
Antigüedad: 12 años, 8 meses
Puntos: 3
Respuesta: Problema con OR y AND

Gracias amigo.

Creo que me esprese mal, obviamente yo era el del problema pero no lo dije de la manera adecuada, lo siento, si tan mal programador no soy

Gracias por tu ayuda, se ha arreglado.
Gracias otra vez

Etiquetas: join, select, sql, tabla
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 11:32.