IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requète sur dates compliquée ...


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 7
    Points
    7
    Par défaut Requète sur dates compliquée ...
    Bonjour à tous, je sèche completement, j'ai besoin de faire un requète pour un systeme de réservation voici la problématique, peut être pourrez vous m'aider

    j'ai 2 tables une table homes et une table reservation2, la table homes contient tous les hébergements à réserver, la table reservation contient les périodes réservées (id , ref(id de homes),dia (jour arrivé) ,dia2 (jour de depart))

    mon problème c'est que je voudrais pouvoir vérifier la disponibilité des apparts sur une période donnée , en gros je donne une date1, une date2 et je voudrait avoir la liste des apparts disponibles (donc non loués) pour cette période ... voici ce que j'ai tenté mais sans succès =>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysql_query("select * from homes LEFT JOIN reservation2 ON homes.id=reservation2.ref WHERE (reservation2.dia NOT BETWEEN $date1 AND $date2) AND (reservation2.dia2 NOT BETWEEN $date1 AND $date2)");
     
    while ($s = mysql_fetch_array($numresults2)) {
      echo $s["homes.title"];
       }
    merci pour votre aide car je ne sais plus comment attaquer, j'ai essayé plusieurs approches pas concluantes , la requète est bonne mais ne me donne aucun résultat le problème c'est que j'aimerais avoir le nom des proprietes (homes.title) dont aucune date (reservation2.dia et reservation2.dia2) ne se trouve dans l'intervalle $dates1 $date2 , sachant que pour la plupart des apparts il n'y a pas d'entrées dans reservation2 (c'est que toutes les periodese sont dispos)

    je ne suis pas certain d'être très clair, pourtant je fais de mon mieux

    merci à tous

    Arnaud

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: Requète sur dates compliquée ...
    En effet, c'est un problème non trivial, mais assez classique (liste des ressources disponibles).

    Ce que tu veux obtenir, c'est la liste des ressources disponibles (ici des chambres, mais si ça avait été du matériel ou toute autre ressource, le problème aurait été le même).


    Voici ce que l'on aurait fait si on avait voulu la liste des ressources reservées (=non dispo):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT home.*
    FROM home
    INNER JOIN reservation2 ON homes.id=reservation2.ref
     
    WHERE (reservation2.dia BETWEEN $date1 AND $date2) OR (reservation2.dia2 BETWEEN $date1 AND $date2)
     
    GROUP BY home.id

    La liste des ressources dispos, c'est la liste des ressources qui n'ont AUCUNE réservation durant la période considérée, donc logiquement, ça devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT home.*
    FROM home
    LEFT OUTER JOIN reservation2 ON homes.id=reservation2.ref
     
    WHERE (reservation2.dia BETWEEN $date1 AND $date2) OR (reservation2.dia2 BETWEEN $date1 AND $date2)
     
    GROUP BY home.id
    HAVING COUNT(reservation2.id)=0
    Essaye un peu pour voir...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse,

    je viens d'essayer, même resultat, pas de reponse, par contre si je test sans le >> HAVING COUNT(reservation2.id)=0 :


    SELECT homes.* FROM homes LEFT OUTER JOIN reservation2 ON homes.id=reservation2.ref WHERE (reservation2.dia BETWEEN '2005-11-01' AND '2005-11-07') OR (reservation2.dia2 BETWEEN '2005-11-01' AND '2005-11-07') GROUP BY homes.id
    j'obtiens les appartements réservés sur la période $date1 $date2

    une idée ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    étrange, j'ai le même resultat avec


    SELECT homes.* FROM homes
    LEFT OUTER JOIN reservation2 ON homes.id=reservation2.ref
    WHERE (reservation2.dia BETWEEN '2005-11-01' AND '2005-11-07')
    OR (reservation2.dia2 BETWEEN '2005-11-01' AND '2005-11-07')
    GROUP BY homes.id

    et avec


    SELECT homes.* FROM homes
    INNER JOIN reservation2 ON homes.id=reservation2.ref
    WHERE (reservation2.dia BETWEEN '2005-11-01' AND '2005-11-07')
    OR (reservation2.dia2 BETWEEN '2005-11-01' AND '2005-11-07')
    GROUP BY homes.id

    ...

  5. #5
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par itklif2
    étrange, j'ai le même resultat avec


    SELECT homes.* FROM homes
    LEFT OUTER JOIN reservation2 ON homes.id=reservation2.ref
    WHERE (reservation2.dia BETWEEN '2005-11-01' AND '2005-11-07')
    OR (reservation2.dia2 BETWEEN '2005-11-01' AND '2005-11-07')
    GROUP BY homes.id

    Et comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT homes.* FROM homes 
    LEFT OUTER JOIN reservation2 
    ON homes.id=reservation2.ref 
       AND (reservation2.dia BETWEEN '2005-11-01' AND '2005-11-07' 
       OR reservation2.dia2 BETWEEN '2005-11-01' AND '2005-11-07') 
    WHERE reservation2.id IS NULL
    ?

    Autre chose : quelle est ta version de MySQL ?
    Pensez au bouton

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Merci bcp pour ton aide, en fait je crois que voici la bonne solution :

    SELECT homes. *
    FROM homes
    LEFT OUTER JOIN reservation2 ON homes.id = reservation2.ref AND (
    '2006-01-14'
    BETWEEN reservation2.dia AND reservation2.dia2 OR '2006-01-18'
    BETWEEN reservation2.dia AND reservation2.dia2
    )
    WHERE reservation2.id IS NULL
    avec les variables $date1 et $date2 qui correspondent à la période de recherche :


    SELECT homes. *
    FROM homes
    LEFT OUTER JOIN reservation2 ON homes.id = reservation2.ref AND (
    $date1
    BETWEEN reservation2.dia AND reservation2.dia2 OR $date2
    BETWEEN reservation2.dia AND reservation2.dia2
    )
    WHERE reservation2.id IS NULL
    je fais quelques tests pour vérifier que tout fonctionne mais a priori c'est bon !

    encore merci
    Arnaud

  7. #7
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    en fait ce n'est toujours pas bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT homes. * 
    FROM homes
    LEFT OUTER JOIN reservation2 ON homes.id = reservation2.ref AND (
    '2004-10-31'
    BETWEEN reservation2.dia AND reservation2.dia2 OR '2007-01-18'
    BETWEEN reservation2.dia AND reservation2.dia2
    )
    WHERE reservation2.id IS NULL
    ca ne colle pas, lorsque je prend une periode large (de 2004 a 2007), je devrais avoir toutes mes "chambres" louées au moins une fois dans cette periode qui n'apparaissent pas et là ce n'est pas le cas, elles apparaisent à part une ou deux ...

    en fait je crois comprendre,
    si j'ai une période louée entrée dans reservation2 : du 14 au 20/01 par ex
    si je recherche une période comprise dans cet intervalle ($date1 =16/01 au $date2=18/01) alors pas de prob ce la fonctionne
    mais si je demande une période du 13 au 21/01 là ca cloche
    il faudrait faire une sous requête pour chaque date de l'intervalle demandé 13/01 , 14/01, 15/01 etc ... et vérifier si aucune de ces dates ne se trouve dans l'intervalle dia-dia2 d'une des entrée de la table reservation2.

    aurais tu une idée de la manière la plus propre de faire cela ?? en SQL ? ou un while en php et plusieurs requetes ?

    je pensais y être j'espère que je ne m'éloigne pas du but ...

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Pour être exhaustif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT homes.* 
    FROM homes
    LEFT OUTER JOIN reservation2 
     
    ON homes.id = reservation2.ref
     
    AND (
       $date1 BETWEEN reservation2.dia AND reservation2.dia2 
    OR $date2 BETWEEN reservation2.dia AND reservation2.dia2
    OR reservation2.dia BETWEEN $date1 AND $date2
    OR reservation2.dia2 BETWEEN $date1 AND $date2 
    )
     
    WHERE reservation2.id IS NULL
    Remarque 1: C'est dommage qu'en MySQL on n'ait pas l'opérateur OVERLAPS du SQL standard

    Reamque 2: C'est marrant de mélanger de l'anglais ("homes") avec de l'Espagnol ("dia").
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. MFC requêtes sur date + (ou-) x jours
    Par Smint dans le forum Access
    Réponses: 3
    Dernier message: 07/10/2006, 07h38
  2. [REQ] Requête sur date et heure
    Par benazerty dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/06/2006, 13h34
  3. [sql server] requête sur dates et heures (format du résultat
    Par isachat666 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/02/2006, 13h48
  4. [ADO] Requète sur dates
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2005, 22h39
  5. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo