Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[mysql] Réservation d'appartement - recherche de dispo

2 réponses
Avatar
William
Bonjour à tous,

Je bute sur un problème depuis un moment pour un script php de
réservation en ligne d'appartements où je dois afficher les
disponibilités suite à une recherche par date d'arrivée et de départ
depuis une base mysql.
Pour obtenir ce que je veux, j'ai créé dans ma base 2 tables, une qui
contient les descriptions des appartements et une autre où sont
enregistré les réservations.

Voici la structure de ma base :

CREATE TABLE `appartements` (
`id` mediumint(5) NOT NULL auto_increment,
`id_client` mediumint(5) NOT NULL default '0',
`lieu` varchar(35) NOT NULL default '',
`nbr_pieces` tinyint(2) NOT NULL default '0',
`prix_de` mediumint(5) NOT NULL default '0',
`prix_a` mediumint(5) NOT NULL default '0',
`descriptif` text NOT NULL,
PRIMARY KEY (`id`),
KEY `lieu` (`lieu`)
)

CREATE TABLE `resa` (
`id` int(6) NOT NULL auto_increment,
`id_loc` mediumint(5) NOT NULL default '0',
`date_dep` date NOT NULL default '0000-00-00',
`date_ret` date NOT NULL default '0000-00-00',
`locataire` varchar(150) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `id_loc` (`id_loc`,`date_dep`,`date_ret`)
)

(Mysql est une version inférieure à 4)
id_loc dans resa correspond à l'id de la table appartements

Mon problème est que je n'arrive pas à faire une requête qui me permette
de récupérer les appartements pour lesquels il n'y a pas de reservation
à un intervalle de dates donné.
J'ai bien fait plusieurs essais, mais évidemment, ça ne marche pas :-(
Un exemple parmi d'autres :

SELECT appartements.id, appartements.lieu, appartements.descriptif FROM
appartements LEFT JOIN resa ON appartements.id = resa.id_loc WHERE
(resa.date_ret < '2004-08-21' OR date_ret > '2004-08-28')

Ce genre de requête pose plusieurs problèmes puisque avec, je n'arrive
pas à exclure les données de la table resa qui serait à l'intervalle de
date demandée. Si j'arrivais a résoudre ce dernier problème la requête
ne m'afficherait que les appartements qui sont présent dans la table
resa et en autant d'exemplaires qu'il y aura d'enregistrements, ce qui
veut dire que les résultats pourrons présenter plusieurs fois le même
appartement et ne pas m'afficher de résultat pour les appartements qui
n'ont pas de réservation.

Il s'agit peut-être aussi d'un problème de méthode, je fais appel à vos
expériences pour m'aider.

D'avance merci.

2 réponses

Avatar
Fred BROUARD - SQLpro
il convient de modéliser une table temporelle et d'utiliser un filtre sur calcul
d'agrégat par sommation des jours d'intervalles.

tout cela avec les requêtes exemples et les explications est décrit en long en
large et en travers au chapitre 8 pages 389 à 398 (recherche de valeurs
contiguës)...

Pour répondre à ceux qui vont m'accuser de vouloir vendre mon bouquin et pas
donner la solution :
1) il n'est pas possible ni correct de reproduire 10 pages de mon bouquin sans
l'accord de mon éditeur pour une diffusion publique
2) il n'est pas nécessaire de l'acheter, vous pouvez le trouver dans de
nombreuses bibliothèques

A +

William a écrit:
Bonjour à tous,

Je bute sur un problème depuis un moment pour un script php de
réservation en ligne d'appartements où je dois afficher les
disponibilités suite à une recherche par date d'arrivée et de départ
depuis une base mysql.
Pour obtenir ce que je veux, j'ai créé dans ma base 2 tables, une qui
contient les descriptions des appartements et une autre où sont
enregistré les réservations.

Voici la structure de ma base :

CREATE TABLE `appartements` (
`id` mediumint(5) NOT NULL auto_increment,
`id_client` mediumint(5) NOT NULL default '0',
`lieu` varchar(35) NOT NULL default '',
`nbr_pieces` tinyint(2) NOT NULL default '0',
`prix_de` mediumint(5) NOT NULL default '0',
`prix_a` mediumint(5) NOT NULL default '0',
`descriptif` text NOT NULL,
PRIMARY KEY (`id`),
KEY `lieu` (`lieu`)
)

CREATE TABLE `resa` (
`id` int(6) NOT NULL auto_increment,
`id_loc` mediumint(5) NOT NULL default '0',
`date_dep` date NOT NULL default '0000-00-00',
`date_ret` date NOT NULL default '0000-00-00',
`locataire` varchar(150) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `id_loc` (`id_loc`,`date_dep`,`date_ret`)
)

(Mysql est une version inférieure à 4)
id_loc dans resa correspond à l'id de la table appartements

Mon problème est que je n'arrive pas à faire une requête qui me permette
de récupérer les appartements pour lesquels il n'y a pas de reservation
à un intervalle de dates donné.
J'ai bien fait plusieurs essais, mais évidemment, ça ne marche pas :-(
Un exemple parmi d'autres :

SELECT appartements.id, appartements.lieu, appartements.descriptif FROM
appartements LEFT JOIN resa ON appartements.id = resa.id_loc WHERE
(resa.date_ret < '2004-08-21' OR date_ret > '2004-08-28')

Ce genre de requête pose plusieurs problèmes puisque avec, je n'arrive
pas à exclure les données de la table resa qui serait à l'intervalle de
date demandée. Si j'arrivais a résoudre ce dernier problème la requête
ne m'afficherait que les appartements qui sont présent dans la table
resa et en autant d'exemplaires qu'il y aura d'enregistrements, ce qui
veut dire que les résultats pourrons présenter plusieurs fois le même
appartement et ne pas m'afficher de résultat pour les appartements qui
n'ont pas de réservation.

Il s'agit peut-être aussi d'un problème de méthode, je fais appel à vos
expériences pour m'aider.

D'avance merci.



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Théo
Je ne connais pas mySQL, surtout avant la v4, mais peut-être peux-tu essayer
qqch comme :

SELECT
appartements.id,
appartements.lieu,
appartements.descriptif
FROM
appartements
WHERE
appartements.id not in
(
SELECT id_loc FROM resa WHERE (resa.date_ret < '2004-08-21' OR
date_ret > '2004-08-28')
)

afin d'avoir les enregistrement pour lesquels (resa.date_ret < '2004-08-21'
OR date_ret > '2004-08-28')

Je ne sais pas si mySQL supporte cette syntaxe ?

PS : le nom des colonnes des tables ne me semble pas toujours clairs...

"William" a écrit dans le message de
news:41236052$0$29674$
Bonjour à tous,

Je bute sur un problème depuis un moment pour un script php de
réservation en ligne d'appartements où je dois afficher les
disponibilités suite à une recherche par date d'arrivée et de départ
depuis une base mysql.
Pour obtenir ce que je veux, j'ai créé dans ma base 2 tables, une qui
contient les descriptions des appartements et une autre où sont
enregistré les réservations.

Voici la structure de ma base :

CREATE TABLE `appartements` (
`id` mediumint(5) NOT NULL auto_increment,
`id_client` mediumint(5) NOT NULL default '0',
`lieu` varchar(35) NOT NULL default '',
`nbr_pieces` tinyint(2) NOT NULL default '0',
`prix_de` mediumint(5) NOT NULL default '0',
`prix_a` mediumint(5) NOT NULL default '0',
`descriptif` text NOT NULL,
PRIMARY KEY (`id`),
KEY `lieu` (`lieu`)
)

CREATE TABLE `resa` (
`id` int(6) NOT NULL auto_increment,
`id_loc` mediumint(5) NOT NULL default '0',
`date_dep` date NOT NULL default '0000-00-00',
`date_ret` date NOT NULL default '0000-00-00',
`locataire` varchar(150) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `id_loc` (`id_loc`,`date_dep`,`date_ret`)
)

(Mysql est une version inférieure à 4)
id_loc dans resa correspond à l'id de la table appartements

Mon problème est que je n'arrive pas à faire une requête qui me permette
de récupérer les appartements pour lesquels il n'y a pas de reservation
à un intervalle de dates donné.
J'ai bien fait plusieurs essais, mais évidemment, ça ne marche pas :-(
Un exemple parmi d'autres :

SELECT appartements.id, appartements.lieu, appartements.descriptif FROM
appartements LEFT JOIN resa ON appartements.id = resa.id_loc WHERE
(resa.date_ret < '2004-08-21' OR date_ret > '2004-08-28')

Ce genre de requête pose plusieurs problèmes puisque avec, je n'arrive
pas à exclure les données de la table resa qui serait à l'intervalle de
date demandée. Si j'arrivais a résoudre ce dernier problème la requête
ne m'afficherait que les appartements qui sont présent dans la table
resa et en autant d'exemplaires qu'il y aura d'enregistrements, ce qui
veut dire que les résultats pourrons présenter plusieurs fois le même
appartement et ne pas m'afficher de résultat pour les appartements qui
n'ont pas de réservation.

Il s'agit peut-être aussi d'un problème de méthode, je fais appel à vos
expériences pour m'aider.

D'avance merci.