8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

actuellement en cours de réalisation d'un site internet, je me retrouve confronté à un problème que je n'arrive pas à résoudre. Il s'agit d'une ou plusieurs requêtes SQL me permettant de gérer une réservation.

Je m'explique, voici ma première table que je nomme CLASSE :
[b]id_classe id_bâtiment numero_classe type_classe[/i]

et ma deuxième table RESERVATION :
[b]id_reservation id_classe date_debut date_fin[/i]

Ce que je souhaite, c'est de savoir quelle est la CLASSE disponible le plus rapidement possible vis à vis de la date du jour. Le numéro de classe, si plusieurs disponibilités à la même date, peut être par ordre chronologique..

J'ai d'abord pensé à faire ceci :
--> sélection de tous les stands qui ne sont pas réservés dans le futur
--> si tous les stands sont réservés, chercher le stand qui a la date de fin la plus proche.


Par contre, je bute sur la requête !
Si jamais vous avez une solution ou une piste Smiley cligne Merci d'avance !
Salut,
en fait la première étape, ça va surtout être de récupérer toutes les classes réservées à une certaine date
En supposant qu'on se base sur des dates avec des formats en timestamp par exemple
Select id_classe from reservation where timestamp_voulu>date_debut and timestamp_voulu<date_fin


A partir de cette requête, on va pouvoir déterminer toutes les classes qui sont libres (en gros toutes les autres):

Select id_classe from classe where id_classe not in (Select id_classe from reservation where timestamp_voulu>date_debut and timestamp_voulu<date_fin)


Puis pour trouver la classe qui à la date de fin la plus proche, il suffit juste de trier par date_fin et on prend le 1er :
Select id_classe from reservation where timestamp_voulu>date_debut and timestamp_voulu<date_fin order by date_fin limit 1


Après on peut aussi complexifier sans doute un peu la 1ere requête, si au lieu de juste un timestamp_voulu, on veut aussi gérer un début et une fin de timestamp_voulu. Du coup au lieu de juste vérifier si un point est dans un intervalle , on va vérifier si les 2 intervalles ont une intersection ( 4 cas mais 2 en vérifient un 3e en même temps)

Select id_classe from reservation where (timestamp_debut_voulu>date_debut and timestamp_debut_voulu<date_fin) or (timestamp_fin_voulu>date_debut and timestamp_fin_voulu<date_fin) or (timestamp_debut_voulu<date_debut and timestamp_fin_voulu>date_fin)


Voila en gros l'idée, j'ai rien testé par contre, mais dans le principe ça devrait être ressemblant
Hello,

Merci pour ta réponse mathieu1004.
au final, j'ai opté pour ceci :

Dans un premier temps

$classe_dispo = FindClasseDispoNow($id_bâtiment, $_SESSION['typeclasse']);
if(empty($classe_dispo ) or !isset($classe_dispo ))
{
	$stand_dispo = FindClasseDispoQuickly($id_bâtiment, $_SESSION['typeclasse']);
}


Et mes fonctions :

Première fonction : je cherche les classes qui sont dispo de suite (non présente dans la table réservation)

function FindClasseDispoNow($bat, $type)
{
	$classe= "";
	$res = sqlquery("select id_classe FROM classe WHERE type_classe= '".$type."' AND id_bâtiment = '".$bat."' AND id_classe NOT IN (SELECT id_classe from reservation WHERE date_fin >= now()) ORDER BY RAND() LIMIT 1",1);
	if(isset($res['id_classe ']) and !empty($res['id_classe ']))
	{
		$classe= $res['id_classe '];
	}
	return $classe; 
} 


et la deuxième, je cherche les classes réservées mais je prends la première dont la réservation s'achève :


function FindClasseDispoQuickly($dpt, $type)
{
	$classe= "";
	$res = sqlquery("select id_classe FROM classe WHERE type_classe = '".$type."' AND id_batiment = '".$dpt."' AND id_classe IN (SELECT DISTINCT id_classe from reservation WHERE date_fin >= now() AND Date_Deb >= now() ORDER BY date_fin ASC) ORDER BY RAND() LIMIT 1",1);
	if(isset($res['id_classe ']) and !empty($res['id_classe ']))
	{
		$classe= $res['id_classe '];
	}
	return $classe; 
} 


J'ai l'impression que ça répond à mes besoins... A voir par la suite !