Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2770 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1018486
albataur
Posté le 19-03-2005 à 17:15:15  profilanswer
 

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
mood
Publicité
Posté le 19-03-2005 à 17:15:15  profilanswer
 

n°1018498
KangOl
Profil : pointeur
Posté le 19-03-2005 à 17:30:51  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°1018502
albataur
Posté le 19-03-2005 à 17:36:20  profilanswer
 

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
n°1019148
Gat$
http://www.wowteamfinder.com
Posté le 20-03-2005 à 18:32:26  profilanswer
 

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

n°1019158
Gat$
http://www.wowteamfinder.com
Posté le 20-03-2005 à 18:36:54  profilanswer
 

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.

n°1019582
albataur
Posté le 21-03-2005 à 11:00:48  profilanswer
 

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.

n°1019972
Gat$
http://www.wowteamfinder.com
Posté le 21-03-2005 à 17:52:08  profilanswer
 

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
n°1019984
albataur
Posté le 21-03-2005 à 18:04:33  profilanswer
 

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;


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
Menu dynamique (problème avec visibility)[Delphi + MySQL] Erreur E_FAIL, comment contourner ?
[ASP.NET] Probleme d'acces BDProblème d'interaction entre une page et une popup
[Access] Incompatibilité Access et Mysql ???vba convert date fr en us d'un txtbox pour requete sql dans formulaire
php/mysql affichage de données à partir d'une base d edonnéesProblème avec un Ghost
Problème avec Oracleexporter uen table ACCESS dans une table Mysql
Plus de sujets relatifs à : [MySQL] Problème avec une requète (jointure ...)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR