Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/01/2015, 16:06
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: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema al listar tabla relacionadas

Cita:
respecto a la 2da no lo entendi muy bien, con el or, es como si el dato estuviera vacio y no es necesario que este con datos, a eso te refieres?
El WHERE trabaja sobre lo que se denomina "Lógica Proposicional", y tanto el AND como el OR son la aplicación práctica de ello, a partir de las tablas de verdad (ver Tablas de Verdad). ¿Eso lo has visto?
Bueno, el AND es una proposición conjuntiva, lo que implica que para que se cumpla y devuelva datos, las dos partes unidas por un AND deben ser verdad. Siempre.


En tu caso, lo que pusiste es que cada una de las condiciones debía ser TRUE, todas, y como el WHERE se verifica para cada uno de los registros que la relacion de tablas en el FROM devuelve, sólo podrías obtener aquellos registros donde todas las condiciones tienes TRUE.
Si al menos una de las condiciones no se cumple, ese registro no se devuelve.
Por eso recibes una tabla vacía.

En OR es la disyunción lógica (A ó B, ó ambos), y expresa que es verdad si al menos uno de las proposiciones es verdad.


Entonces, devuelve aquellos registros donde al menos una de las condiciones se cumple.

En tu caso, me refiero a "opcionales" a la situación en que el usuario no completa todos los campos en el formulario, y cuando se envía a realizar la búsqueda, alguno de los valores no está (cadena vacía), o bien está mal escrito, pero alguno de los otros si se envió y aparece en el registro.
En esa situación el uso de OR permite que con que solo se cumpla una de las comparaciones, el registro sea devuelto como resultado.

¿Se entiende mejor?

Ahora bien, desde el punto de vista de SQL, lo correcto y para evitar errores de interpretación es, como ya te lo mencioné antes, que las comparaciones contra valores escalares no usen LIKE, sino =, <, >, o BETWEEN. También se debe tener en cuenta que si son números, no deben quedar encerrados entre apostrofos, para evitar conversiones implícitas que afecten la performance.

En definitiva, la sintaxis correcta de tu query, para MySQL sería:
Código MySQL:
Ver original
  1.     V.idvideo,
  2.     V.nombre,
  3.     V.link,
  4.     V.sinopsis,
  5.     V.fecha,
  6.     V.direccion,
  7.     G.idvideo,
  8.     G.idgenero
  9.     video V INNER JOIN gen_video G ON V.idvideo = G.idvideo
  10.     V.nombre LIKE '%$nombre%'
  11.     OR V.link LIKE '%$link%'
  12.     OR V.sinopsis LIKE '%$sinopsis."%'
  13.     OR V.fecha ='$fecha'
  14.     OR V.direccion LIKE '%$direccion%'
  15.     OR V.idgenero = '$generos';
Esto, asumiendo que "idgenero" es un ID numerico, y que "fecha" es un campo DATE o DATETIME. Si es un VARCHAR está mal.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)