[MySQL] Problème avec une requète (jointure ...)

Problème avec une requète (jointure ...) [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 19-03-2005 à 17:15:15    

Salut,
 
Je galère avec une requète assez compliquée à faire en MySQL.
Il s'agit d'un site de réservation de camping. J'ai une table Emplacement qui contient tous les emplacements et une table Reservation qui contient ... les réservations :D
 
Dans la table réservation j'ai un champ "idEmplacement" qui contient l'id de l'emplacement réservé, un champ "debut" et "fin" qui contiennent les dates de début et de fin de la réservation (en temps unix).
Et pour que ce soit un peu plus marrant j'ai un deuxième champ "garage_mort" qui peut contenir un id d'emplacement également. Il s'agit en fait d'un deuxième emplacement qu'il est possible de réserver pour garer une voiture par ex.
 
Voila la requète que j'effectue pour cela :


SELECT Emplacement.idEmplacement
   FROM Emplacement, Reservation
   WHERE(    
      (Emplacement.idEmplacement = Reservation.idEmplacement
      AND
      (
       Reservation.fin <= \''.$_SESSION['date_debut'].'\'
       OR Reservation.debut >= \''.$_SESSION['date_fin'].'\'
      ))
      OR
      Emplacement.idEmplacement != Reservation.idEmplacement)


 
Je précise également qu'en mysql (dans les version 3 en tout cas) il n'est ni possible de faire des MINUS, ni des NOT IN ni d'ailleurs n'importe quelle requète imbriquée... ce serait trop facile sinon  :)  
 
Le résultat de la requète me donne beaucoup trop de résultats. Vous pouvez voir ici ce que ca donne : http://bougetoi.com/projet/site/reservation1.php
Il y a dans la base une réservation sur l'emplacement 1 sans garage mort et une autre sur le 2 avec un garage mort en 3.
 
Sinon la solution sera de le faire de plusieurs requète et de traiter ça en php mais bon ... c'est vraiment pas top.
 
Merci beaucoup d'avance pour votre aide ;)
 
 :hello:


Message édité par albataur le 19-03-2005 à 17:17:58
Reply

Marsh Posté le 19-03-2005 à 17:15:15   

Reply

Marsh Posté le 19-03-2005 à 17:30:51    

et qu'est-ce que tu veux faire exactement...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 19-03-2005 à 17:36:20    

Ah ouais ça peut être utile de le préciser  :whistle:  
En fait la requète doit sélectionner tous les idEmplacement non réservés à la date donnée ($_SESSION['debut'] et $_SESSION['fin']).
Dans la première partie du where de la requète (avant le OR) je sélectionne (normalement) tous les emplacement réservés mais pas pendant la période choisie.
Le deuxième partie est censé prendre tous les emplacement qui ne sont pas réservés du tout.


Message édité par albataur le 19-03-2005 à 17:38:50
Reply

Marsh Posté le 20-03-2005 à 18:32:26    

A mon avis le fait que tu aies trop de result est dut a cela :  
 
OR Emplacement.idEmplacement != Reservation.idEmplacement
 
:D

Reply

Marsh Posté le 20-03-2005 à 18:36:54    

Tu ferais pas plutot :  
 
OR Emplacement.idEmplacement == '' ?  
 
Ou OR Emplacement.idEmplacement == 0  ?
 
 
en prenant soin de mettre 0 dans ce champ quand il n'y a pas de reservation.  
 
Mais bon je pense que le mieux ca serait de faire une 3eme table "emplacements_reserves" pour un peu plus normaliser le tout!
 
enfin si j'ai bien compris ce ke tu veux faire.

Reply

Marsh Posté le 21-03-2005 à 11:00:48    

Gat$ a écrit :

Tu ferais pas plutot :  
 
OR Emplacement.idEmplacement == '' ?  
 
Ou OR Emplacement.idEmplacement == 0  ?
 
 
en prenant soin de mettre 0 dans ce champ quand il n'y a pas de reservation.  
 
Mais bon je pense que le mieux ca serait de faire une 3eme table "emplacements_reserves" pour un peu plus normaliser le tout!
 
enfin si j'ai bien compris ce ke tu veux faire.


 
Merci d'avoir répondu mais je comprend pas trop ce que tu veux dire.
En fait le Emplacement.idEmplacement != Reservation.idEmplacementest censé prendre tous les emplacements qui sont dans la table Emlacement mais pas dans la table Reservation.
Donc finalement tous les emplacements qui ne sont jamais réservés.
La table "emplacements_reserves" c'est en fait la table Reservation.

Reply

Marsh Posté le 21-03-2005 à 17:52:08    

salut
 
Ben dans ta requete tu dis :  
 
Je veux affiches tous les enregistrements de la table emplacement et reservation, ou l'idEmplacement sont egaux (juske la c ok) mais ensuite tu ajoutes et aussi ceux qui ne sont pas egaux.
 
Donc ca signifie en d'autres termes que tu veux tous les resultats.
 
c'est comme si tu faisais :  
 
 
SELECT Emplacement.idEmplacement
   FROM Emplacement, Reservation
   WHERE    
       Reservation.fin <= \''.$_SESSION['date_debut'].'\'
       OR Reservation.debut >= \''.$_SESSION['date_fin'].'\'
 
 
tout simplement. Donc ta jointure sert a rien. car y a des resultats qui ont pas de sens.
 
Donc c'est logique que tu aies trop de  résultats.
 
Moi je te propose de mettre 0 dans le champs Emplacement.idEmplacement lorsqu'il n'y a aucun emplacement associé.
 
Mais il faudrait que tu mettes la structure exacte de tes deux tables ca serait ptete plus clair.. a+


Message édité par Gat$ le 21-03-2005 à 17:53:20
Reply

Marsh Posté le 21-03-2005 à 18:04:33    

Salut,
Merci d'avoir répondu encore une fois.
T'as raison je pense que le problème venait de là. Je pense que ce n'est pas possible de le faire en une seule requète comme ça.
Je l'ai fait en 2 requètes avec un traitement php et ça fonctionne.
Voici le code si ça t'intéresse :

Code :
  1. $sql='SELECT DISTINCT idEmplacement, garage_mort
  2.   FROM Reservation
  3.   WHERE(
  4.      (   
  5.       Reservation.fin >= \''.$_SESSION['date_debut'].'\'
  6.       AND Reservation.debut <= \''.$_SESSION['date_debut'].'\'
  7.      )
  8.      OR
  9.      (
  10.       Reservation.fin >= \''.$_SESSION['date_fin'].'\'
  11.       AND Reservation.debut <= \''.$_SESSION['date_fin'].'\'
  12.      )
  13.     )';
  14. $res=queryDB($sql);
  15. $sql2='SELECT idEmplacement
  16.   FROM Emplacement';
  17. $res2=queryDB($sql2);
  18. //Premier tableau contenant les emplacements réservés à la période donnée
  19. $i=0;
  20. while($row=mysql_fetch_array($res)) {
  21.  $emp_reserves[$i]=$row['idEmplacement'];
  22.  if($row['garage_mort']!=0){
  23.   $i++;
  24.   $emp_reserves[$i]=$row['garage_mort'];
  25.  }
  26.  $i++;
  27.    }
  28. //Deuxième tableau contenant les emplacements
  29. $i=0;
  30. while($row2=mysql_fetch_array($res2)) {
  31.  $emp[$i]=$row2['idEmplacement'];
  32.  $i++;
  33.    }
  34.    //Emplacements libres à la période donnée
  35. if(count($emp_reserves)==0)
  36.  $emp_libres=$emp;
  37. else
  38.  $emp_libres=array_values(array_diff($emp, $emp_reserves));
  39. return $emp_libres;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed