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 V.idvideo,
V.nombre,
V.link,
V.sinopsis,
V.fecha,
V.direccion,
G.idvideo,
G.idgenero
video V
INNER JOIN gen_video G
ON V.idvideo
= G.idvideo
V.nombre
LIKE '%$nombre%' OR V.sinopsis
LIKE '%$sinopsis."%' OR V.direccion
LIKE '%$direccion%' 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.