Ver Mensaje Individual
  #8 (permalink)  
Antiguo 29/07/2015, 18:22
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: 17 años
Puntos: 2658
Respuesta: Problema con selects anidados

Cita:
Cuando copio y pego tu consulta... me devuelve las cuatro matriculas.
¿O sea que estás haciendo Copy+Paste?
¿No analizas nada?
¿Lo quieres todo resuelto y sin esfuerzo?

Ok, entonces te paso esto:

Código MySQL:
Ver original
  1. mysql> DROP TABLE IF EXISTS ClienteAuto;
  2. Query OK, 0 rows affected (0.06 sec)
  3.  
  4. mysql> CREATE TABLE ClienteAuto
  5.     -> (Fk_idCliente CHAR(9) NOT NULL,
  6.     -> Fk_matricula_auto VARCHAR(15) NOT NULL,
  7.     -> fecha_inicio_alquiler DATE NOT NULL,
  8.     -> fecha_final_alquiler DATE NOT NULL,
  9.     -> PRIMARY KEY (Fk_idCliente, Fk_matricula_auto)
  10.     -> );
  11. Query OK, 0 rows affected (0.00 sec)
  12.  
  13. mysql>
  14. mysql> INSERT INTO clienteauto (`Fk_idCliente`,`Fk_matricula_auto`,`fecha_inicio_alquiler`,`fecha_final_alquiler`)
  15.     -> VALUES ('123456789', 'abb1414', '2006-06-06','2006-06-07');
  16. Query OK, 1 row affected (0.02 sec)
  17.  
  18. mysql>
  19. mysql> INSERT INTO clienteauto (`Fk_idCliente`,`Fk_matricula_auto`,`fecha_inicio_alquiler`,`fecha_final_alquiler`)
  20.     -> VALUES ('123456789', '48731cda', '2006-06-06','2006-06-07');
  21. Query OK, 1 row affected (0.00 sec)
  22.  
  23. mysql>
  24. mysql> INSERT INTO clienteauto (`Fk_idCliente`,`Fk_matricula_auto`,`fecha_inicio_alquiler`,`fecha_final_alquiler`)
  25.     -> VALUES ('123456789', 'abb141417', '2006-06-06','2006-06-07');
  26. Query OK, 1 row affected (0.00 sec)
  27.  
  28. mysql>
  29. mysql> INSERT INTO clienteauto (`Fk_idCliente`,`Fk_matricula_auto`,`fecha_inicio_alquiler`,`fecha_final_alquiler`)
  30.     -> VALUES ('123456789', 'abb1865', '2006-06-04','2006-06-05');
  31. Query OK, 1 row affected (0.00 sec)

Bueno, veamos lo que hay:

Código MySQL:
Ver original
  1. mysql> SELECT `Fk_matricula_auto`, fecha_inicio_alquiler, fecha_final_alquiler
  2.     -> FROM `clienteauto` ;
  3. +-------------------+-----------------------+----------------------+
  4. | Fk_matricula_auto | fecha_inicio_alquiler | fecha_final_alquiler |
  5. +-------------------+-----------------------+----------------------+
  6. | 48731cda          | 2006-06-06            | 2006-06-07           |
  7. | abb1414           | 2006-06-06            | 2006-06-07           |
  8. | abb141417         | 2006-06-06            | 2006-06-07           |
  9. | abb1865           | 2006-06-04            | 2006-06-05           |
  10. +-------------------+-----------------------+----------------------+
  11. 4 rows in set (0.00 sec)

Ahora bien, corrigiendo un poco lo que te puse, tenemos:
Código MySQL:
Ver original
  1. mysql> SELECT `Fk_matricula_auto`, fecha_inicio_alquiler, fecha_final_alquiler
  2.     -> FROM `clienteauto`
  3.     -> WHERE
  4.     ->     (fecha_inicio_alquiler NOT BETWEEN '2006-06-05' AND '2006-06-07')
  5.     ->     AND (fecha_final_alquiler NOT BETWEEN '2006-06-05' AND '2006-06-07')
  6.     ->     AND (NOT fecha_inicio_alquiler < '2006-06-05' AND  fecha_final_alquiler > '2006-06-07')
  7.     ->  and Fk_matricula_auto = 'abb1414';
  8. Empty set (0.00 sec)
No devuelve datos, lo cual sería correcto porque la matricula "abb1414" está alquilada para la fecha indicada.
Si en cambio buscamos una fecha anterior o posterior:
Código MySQL:
Ver original
  1. mysql> SELECT `Fk_matricula_auto`, fecha_inicio_alquiler, fecha_final_alquiler
  2.     -> FROM `clienteauto`
  3.     -> WHERE
  4.     ->     (fecha_inicio_alquiler NOT BETWEEN '2006-06-08' AND '2006-06-09')
  5.     ->     AND (fecha_final_alquiler NOT BETWEEN '2006-06-08' AND '2006-06-09')
  6.     ->     AND NOT (fecha_inicio_alquiler < '2006-06-08'  AND  fecha_final_alquiler > '2006-06-09')
  7.     ->  and Fk_matricula_auto = 'abb1414';
  8. +-------------------+-----------------------+----------------------+
  9. | Fk_matricula_auto | fecha_inicio_alquiler | fecha_final_alquiler |
  10. +-------------------+-----------------------+----------------------+
  11. | abb1414           | 2006-06-06            | 2006-06-07           |
  12. +-------------------+-----------------------+----------------------+
  13. 1 row in set (0.00 sec)
Lo cual es correcto porque la única fecha de alquiler de esa matricula termina el 7/6/2006, antes del periodo indicado.
Y si no pongo la matricula, debería devolver todos:
Código MySQL:
Ver original
  1. mysql> SELECT `Fk_matricula_auto`, fecha_inicio_alquiler, fecha_final_alquiler
  2.     -> FROM `clienteauto`
  3.     -> WHERE
  4.     ->     (fecha_inicio_alquiler NOT BETWEEN '2006-06-08' AND '2006-06-09')
  5.     ->     AND (fecha_final_alquiler NOT BETWEEN '2006-06-08' AND '2006-06-09')
  6.     ->     AND NOT (fecha_inicio_alquiler < '2006-06-08'  AND  fecha_final_alquiler > '2006-06-09')
  7.     -> ;
  8. +-------------------+-----------------------+----------------------+
  9. | Fk_matricula_auto | fecha_inicio_alquiler | fecha_final_alquiler |
  10. +-------------------+-----------------------+----------------------+
  11. | 48731cda          | 2006-06-06            | 2006-06-07           |
  12. | abb1414           | 2006-06-06            | 2006-06-07           |
  13. | abb141417         | 2006-06-06            | 2006-06-07           |
  14. | abb1865           | 2006-06-04            | 2006-06-05           |
  15. +-------------------+-----------------------+----------------------+
  16. 4 rows in set (0.00 sec)
Si pongo que comience antes de la menor de las fechas, no devolverá nada:
Código MySQL:
Ver original
  1. mysql> SELECT `Fk_matricula_auto`, fecha_inicio_alquiler, fecha_final_alquiler
  2.     -> FROM `clienteauto`
  3.     -> WHERE
  4.     ->     (fecha_inicio_alquiler NOT BETWEEN '2006-06-03' AND '2006-06-09')
  5.     ->     AND (fecha_final_alquiler NOT BETWEEN '2006-06-03' AND '2006-06-09')
  6.     ->     AND NOT (fecha_inicio_alquiler < '2006-06-03'  AND  fecha_final_alquiler > '2006-06-09');
  7. Empty set (0.00 sec)
Y si, finalmente, pongo como fecha una intermedia en la del "abb1865", devolverá los otros tres:
Código MySQL:
Ver original
  1. mysql> SELECT `Fk_matricula_auto`, fecha_inicio_alquiler, fecha_final_alquiler
  2.     -> FROM `clienteauto`
  3.     -> WHERE
  4.     ->     (fecha_inicio_alquiler NOT BETWEEN '2006-06-03' AND '2006-06-04')
  5.     ->     AND (fecha_final_alquiler NOT BETWEEN '2006-06-03' AND '2006-06-04')
  6.     ->     AND NOT (fecha_inicio_alquiler < '2006-06-03'  AND  fecha_final_alquiler > '2006-06-04');
  7. +-------------------+-----------------------+----------------------+
  8. | Fk_matricula_auto | fecha_inicio_alquiler | fecha_final_alquiler |
  9. +-------------------+-----------------------+----------------------+
  10. | 48731cda          | 2006-06-06            | 2006-06-07           |
  11. | abb1414           | 2006-06-06            | 2006-06-07           |
  12. | abb141417         | 2006-06-06            | 2006-06-07           |
  13. +-------------------+-----------------------+----------------------+
  14. 3 rows in set (0.00 sec)
En resumen, la logica que yo expliqué es correcta, aunque había un par de detalles mal puestos en el ejemplo, que hubieses podido descubrir con solo ponerte a analizar lo que posteé.
Espero sirva todo esto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)