Requête sql de disponibilités [Résolu]

Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Dernière intervention
6 février 2008
- - Dernière réponse : cs_f6xara
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Dernière intervention
6 février 2008
- 6 juil. 2006 à 10:18
Voilà, pour une centrale de réservations, j'enregistre les disponibilités de chaque chambres pour chaque hotels pour chaque jours de l'année.

Lors de la recherche de disponibilité, je me retrouve donc avec une base de données de plusieurs centaines d'hotel, possédant chacun plusieurs type de chambre dont les réservations sont enregistrées par jour.
Donc une table avec énormément d'enregistrement et les recherches deviennent trop longues.

Alors une ptite question pour ceux qui pourrait m'aider à optimiser la partie SQL

Actuellement, il n'y a que 2 tables utiles (seuls les champs utils sont listés).
La table CHAMBRE avec comme champs
id_chambre int
nom_chambre text
    (exemple de données :
        1 | chambre lit simple
        2 | chambre lit double
    )

et la table RESERVATION
id_reservation int
date_reservation date (format YYYY-MM-DD)
chambre_reservation int (correspondant à CHAMBRE.id_chambre)
    (exemple de données :

        1 | 2006-07-05 | 1

        2 | 2006-07-06 | 1
        2 | 2006-07-05 | 2

    )

Alors ce que je cherche à faire est simple mais je souhaiterais le faire si possible en une seule requête

A partir d'une date saisie par un utilisateur ($dDate) et le nombre de nuit où il va rester ($iNbNuits) je souhaiterais connaitres toutes les chambres etant disponibles pour toutes les dates de l'interval de temps.

Exemple
Si $dDate = '2006-07-05';
$iNbNuits = 4;

je souhaiterais connaitre toutes les chambres disponibles le 2006-07-05 ET le 2006-07-06 ET le 2006-07-07 Et le 2006-07-08

Le code php est fait, il ne me manque vraiment que la requete.
Actuellement j'ai cette requête
select * from reservation WHERE date_reservation >= '2006-07-05' AND date_reservation <= '2006-07-08'
Celle ci me ressort toutes mes chambres disponibles dans cet interval, certaines étant disponible qu'une nuit

Alors si quelqu'un a une idée :) je suis preneur
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Dernière intervention
6 février 2008
3
Merci
C'est bon j'ai résolu mon problème :)
si ça peut aider quelqu'un voici comment j'ai fais

function dateXdays($X,$FromDate){ // date dans X jours
    $MyDate = explode('-',$FromDate);
    $XDate = getdate(mktime(0,0,0,$MyDate[1],$MyDate[2]+$X,$MyDate[0]));
    return($XDate['year'].'-'.sprintf('%02d', $XDate['mon']).'-'.sprintf('%02d', $XDate['mday']));
}

$sql = mysql_query("select chambre_reservation from reservation where date_reservation>='".$_POST['Adep'].'-'.$_POST['Mdep'].'-'.$_POST['Jdep']."' and date_reservation<='".dateXdays($_POST['NbNuit'], $_POST['Adep'].'-'.$_POST['Mdep'].'-'.$_POST['Jdep'])."' order by chambre_reservation asc");

$listeChambre = array();
while($result = mysql_fetch_assoc($sql)){
    // on compte combien d enregistrement on a par chambre comprises dans l'intervalle
    if(!isset($listeChambre[$result['chambre_reservation']])) { $listeChambre[$result['chambre_reservation']] = 1; }else{    $listeChambre[$result['chambre_reservation']]++; }
}
// tri du tableau pour avoir ceux ayant le plus d enregistrement
arsort($listeChambre);
$max = 0;
$newListe = array();
foreach($listeChambre as $k=>$v){
    // on enregistre le nombre d'enregistrement ayant le plus de critères voulus
    if($max==0){ $max = $v; }
    if($max>$v){ break; }else{ $newListe[] = $k; }
}
// $newListe contient toutes les chambres correspondant au mieux à la recherche

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cs_f6xara
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Dernière intervention
29 décembre 2012
0
Merci
entre 2 dates ca s apelle BETWEN en SQL
donc essayes ca ira peut etre mieux
--------------------------------------------------------------------------------------------------
         Ilvaut mieux poser une question et passer pour bête que le rester toutesa vie
Commenter la réponse de Teclis01
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Dernière intervention
6 février 2008
0
Merci
Le problème ne vient pas des dates ni de l'intervalle de temps. Il vient que dans cette requete j'obtiens toutes les chambres ayant au moins une journée de disponible dans l'intervalle de temps et je souhaiterais avoir soit l'ensemble des chambres disponibles pou la totalité des jours soit au moins classées par le plus de jours disponibles de l'intervalle.

Pasque actuellement j'obtiens comme résultat
id_reservation    |   date_reservation   |    chambre reservation
1                           2006-07-05            1
2                           2006-07-05            2
3                           2006-07-06            1
4                           2006-07-07            1
5                           2006-07-07            2
10                         2006-07-08            1
11                         2006-07-08            2

Dans cet exemple la chambre 2 est disponible 3 jours sur 4 et la chambre 1 est disponible la totalité des jours
Donc que pourrais je rajouter dans ma requete pour qu'elle me ressorte que ceux disponibles dans la totalité des jours
(j'essaye avec des requetes imbriqué et des count() mais je n'avance pas :) )
Commenter la réponse de cs_f6xara
Messages postés
1423
Date d'inscription
mardi 14 décembre 2004
Dernière intervention
29 décembre 2012
0
Merci
on met les dates dans un tableau =>$aDates
deja tu recuperes ttes les id des chambres => $aIdChambre
foreach($aIdChambre as $iIdChambre){
$iCptJour=0;
    foreach($aDates as $sDate){
        $sSql='SELECT * FROM matable WHERE date_reservation='.$sDate;
        //on balance la requete
        //si lenregistrement existe alors $iCptJour++;
    }
    //on range dans un tableau le nombre de jour disponible,les dates disponibles et le numero de la chambre
}
//enfin on met en forme

J ai ptet oublié des choses mais en gros ca doit ressembler a ca
--------------------------------------------------------------------------------------------------
         Ilvaut mieux poser une question et passer pour bête que le rester toutesa vie
Commenter la réponse de Teclis01
Messages postés
68
Date d'inscription
samedi 1 novembre 2003
Dernière intervention
6 février 2008
0
Merci
Oui mais le but de ce post c est que cette solution n'est pas efficace car j'ai je crois pour l'instant 300 hotels contenant chacun 6 ou / types de chambres différents, donc ca me ferais déjà 2000 id_chambre et donc deja plus de 2000 requete par jour de l'interval à faire. donc si il s'agit d'un sejour de 2semaines, ca fait 28000 requêtes.

Vu qu'il s'agit d'un site pas mal fréquenté sur un serveur dédié, j'ai peur qu'il nuise à toutes les autres sites hébergés pendant la saison touristique.

donc j'essaye plus de me retourner sur une solution comme celle ci sachant qu'elle est fausse mais que ça doit etre possible
select * from reservation where chambre_reservation in (SELECT chambre_reservation FROM reservation WHERE date_reservation >= '2006-07-05' AND date_reservation <= '2006-07-08')
Commenter la réponse de cs_f6xara

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.