Requête sql de disponibilités

Résolu
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008 - 5 juil. 2006 à 14:53
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre 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

5 réponses

cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
6 juil. 2006 à 10:18
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
3
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
5 juil. 2006 à 15:03
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
0
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
5 juil. 2006 à 15:11
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 :) )
0
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
5 juil. 2006 à 15:35
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
5 juil. 2006 à 15:44
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')
0
Rejoignez-nous