A ver mi propuesta era sobre tu diseño en el que no nos has dicho en ningun momento que tengas la tabla reservas.
Por lo que nos has mostrado tienias una tabla cabanias y otra complejos, mis consultas solo llaman esas tablas....
Luego te sugeri que el dieño no era optimo que necesitavas la tabla reservas.... en ese caso solo tienes que substituir cabanias por reservas en las subconsultas ...
En cuanto a tu query creo que deberias leer un poco del manual
Cita: SELECT Idcabania FROM cabanias WHERE true
NOT IN
SELECT Idcabania From ocupadas WHERE fecha_inicio <= "'.$fecha1.'" and fecha_final >="'.$fecha2.'"
traduciendo esa consulta intenta seleccionar cabañas donde verdadero no este en la lista de cabañas ocupadas....
así si funcionará... pero el diseño con una tabla de cabañas ocupadas* es peor que el anterior... lo siento.
* Ocupadas en función de que?
Código MySQL:
Ver originalWHERE fecha_inicio
<='$fecha1' AND fecha_final
>='$fecha1' WHERE fecha_inicio
<='$fecha2' AND fecha_final
>='$fecha2' WHERE fecha_inicio
>='$fecha1' AND fecha_final
<='$fecha2')
Código MySQL:
Ver originalWHERE (fecha_inicio
<='$fecha1' AND fecha_final
>='$fecha1') OR (fecha_inicio
<='$fecha2' AND fecha_final
>='$fecha2') OR (fecha_inicio
>='$fecha1' AND fecha_final
<='$fecha2'))
Una alternativa.... ya con reservas..... reuerda los parentesis no se ponen por estetica ni para que se pueda leer mas facil....