8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,
Je me présente je suis un programmeur pour une agence web. Pour un de mes projets : Création d'un système de réservation hôtel j'ai un soucis avec une requête SQL.

Voilà ce que j'aimerai faire :

J’ai des chambres d’hôtels avec un prix et une quantité par défaut pour chaque chambres

Ex : chambre double quantité :2 prix : 135 euros
Chambre simple quantité : 3 prix : 70 euros

Dès que la chambre se créer, elle s’insère en base de données

Je créer des événements qui permettent de mettre des prix et une capacité à une certaine période

Ex : chambre double quantité : 3 prix : 150 euros du 18 avril au 30 avril 2013

Dès que je créer un événement il s’insère en base de données dans une table spécifique.

Mais imaginons je créer un événement une semaine plus tard.

Ex : chambre double quantité : 4 prix : 160 euros du 25 avril au 5 juin 2013


Tous les résultats s’affiche dans un calendrier qui indique pour le jour l’événement qu’il y a à cette date

Ex : le 28 avril 2013 chambre double quantité : 4 prix : 160 euros.

Seulement ma base de données me renvoie deux événements (normal pour cette date j’ai deux événement) mais je n’en veux qu’un et je veux le plus récent des deux (donc l’id le plus grand avec les informations de cet ID et non pas de l’autre) .

Requête :

SELECT resourceid, datebegin, dateend, price, quantite, id_calendar
                                                FROM wp_res_calendar
                          WHERE '2013-03-03' >= datebegin and '2013-03-03'<= dateend
GROUP BY resourceid
                          ORDER BY id_calendar DESC
Non, justement je ne peut pas me limiter à un seul résultat de recherche car je veux tous les évènements pour toutes les chambres à cette date.

Ex : au 28 avril 2013
chambre double quantité : 4 prix: 160 € au lieu de quantité : 3 prix : 135 €
chambre simple quantité : 2 prix : 80 € au lieu de quantité : 3 prix : 70 €
Salut,

a écrit :
Seulement ma base de données me renvoie deux événements (normal pour cette date j’ai deux événement) mais je n’en veux qu’un et je veux le plus récent des deux (donc l’id le plus grand avec les informations de cet ID et non pas de l’autre) .


a écrit :
justement je ne peut pas me limiter à un seul résultat de recherche car je veux tous les évènements pour toutes les chambres à cette date.


Faudrait savoir ce que tu veux , ou mieux l'exprimer !
Bonjour Zed13,

Désolé si je me fais mal comprendre mais, mon problème est un peu compliqué à expliquer donc je vais essayer de mieux résumé mon problème avec un exemple.

Ex :

- j'ajoute un évènement du 5 mars au 5 avril 2013

chambre double quantité : 3 prix : 135 euros

- une semaine plus tard j'ajoute un nouvel évènement du 10 mars au 30 mars 2013

chambre double quantité : 2 prix : 140 euros

On fait une requête


SELECT resourceid, datebegin, dateend, price, quantite, id_calendar
FROM wp_res_calendar
WHERE '2013-03-10' >= datebegin and '2013-03-10'<= dateend
ORDER BY id_calendar DESC


Cela nous sort tous les évènements de toutes les chambres au 10 mars 2013

Du coup le 10 mars on se retrouve avec deux évènements pour la chambre double sauf que moi j'en veux qu'un et je veux l’évènement le plus récent rentré en base de données.

Par exemple je veux que mon calendrier affiche par exemple au 10 mars 2013 pour la chambre double : quantité : 2 prix : 140 euros
et non quantité : 3 prix: 135 euros et quantité : 2 prix : 140 euros

Est-ce que vous comprenez mieux ou pas ?
Bonjour,

resourceid récupère l'id de la chambre

Je vous met le code qui affiche le corps du tableau peut être que cela peut mieux vous aider


//Requête avec les valeurs par défaut
		$qry="SELECT resourceid, name, price, capacity
		FROM ".$wpdb->prefix . "res_resources
		ORDER BY resourceid";
		$results=$wpdb->get_results($wpdb->prepare($qry), ARRAY_N );
	   
	    //Affichage des résultats
		foreach($results as $value){
			$content .='<tr>
			<td style="text-align: center;">'.$value[0] /*ID  de la chambre*/.'</td>
			<td style="text-align: center;">'.$value[1] /*Nom de la chambre*/.'</td>';
			
			// pour chaque jour du calendrier
			foreach($days as $d=>$w){
			  $content .='<td style="text-align: center;">';
			  
			  //Date du jour
			  $time = strtotime("$year-$m-$d");
			  $jours =''.$year.'-'.$m.'-'.$d.'';
			  
			  //Requête événement
			  $qry2="SELECT resourceid, datebegin, dateend, price, quantite, max(id_calendar)
			  FROM ".$wpdb->prefix . "res_calendar
			  WHERE '$jours' >= datebegin and '$jours'<= dateend
			  GROUP BY resourceid
			  ORDER BY id_calendar DESC";
			  $results2=$wpdb->get_results($wpdb->prepare($qry2), ARRAY_N );
			  
			  foreach($results2 as $evt){
				  
				  // Si ID de la chambre de la requête 2 est égale à l'ID de la chambre de la requête 1
				  if($evt[0] == $value[0]){
					  // On affiche le prix et la quantité de la chambre à la date D
					  $content .='<div class="qte_evt">'.$evt[4].'</div><div class="prix_evt">'.utf8_encode(substr(utf8_decode($evt[3]),0,3)).' € </div>'; 	
				  }   
			  }
			  
			  $content .='</td>';
			}
			$content .='</tr>';
		}
Hello, si j'ai bien compris ton problème, cette requête devrait convenir:


SELECT DISTINCT r.name, r.price, r.capacity, c.datebegin, c.dateend, c.price, c.quantite, max(c.id_calendar )
FROM res_resources r
INNER JOIN res_calendar c ON r.resourceid = r.resourceid
WHERE '$jours' >= datebegin and '$jours'<= dateend
GROUP BY resourceid


Chaque ligne récupère le nom de ta chambre, et la dernière transaction dans la table calendar assignée à cette chambre.

Je te conseille de revoir le langage SQL; en matière de réservation tu vas avoir des problématiques nettement plus difficiles à résoudre que ça. (en particulier le recouvrement de dates: bonjour les triggers et procédures stockées Smiley langue !)
Merci pour votre réponse.

J'ai essayé ce que vous m'avez donné. Malheureusement j'ai un souci c'est qu'il me donne le même id_calendar pour toutes les chambres.

Je vous joint une image des résultats de la requête.

upload/48651-sql.jpg

Pour ce qui est du reste, je verrai par la suite... Smiley confus Une chose à la fois