IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête période disponibilité pour réservation


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Par défaut Requête période disponibilité pour réservation
    Bonjour à tous,

    J'ai trouvé sur le forum différentes pistes pour créer une requête de recherche de disponibilité d'appartements sur une période donnée.

    Voici la requête sous MySQL que j'ai fini par appliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    SELECT `Apartment`.`id`, `Apartment`.`name`, `Apartment`.`sleepings`, `Apartment`.`rooms`, `Apartment`.`floorarea`
        FROM `apartments` AS `Apartment`
        WHERE `Apartment`.`is_online` = 1
            AND `Apartment`.`is_available_to_rent` = 1
            AND `Apartment`.`sleepings` >= 1
            AND `Apartment`.`city_id` = 2
            AND NOT EXISTS (
                SELECT id
                FROM periods as `Period`
                WHERE
                   `Period`.`start_date` BETWEEN '2012-04-02' AND '2012-04-13'
                    OR `Period`.`end_date` BETWEEN '2012-04-02' AND '2012-04-13'
                    OR (
                        `Period`.`start_date` < '2012-04-02'
                        AND `Period`.`end_date` > '2012-04-13'
                    )
            );
    Ceci fonctionne très bien si dans ma table periods, je n'ai aucun appartement qui aurait une réservation dans la période considérée.

    Par contre, dès que j'ai plusieurs appartements dans la table periods, dont l'un au moins a une réservation incluse dans ou chevauchant la période de réservation, alors forcément la requête me renvoie 0 résultat.

    J'ai du mal à imaginer la requête qui me permettrait de ramener les appartements disponibles, tout en éliminant ceux qui ont une réservation

    Merci par avance à ceux qui pourront m'orienter vers la bonne piste

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    une petite description des tables serai bienvenue.

    en particulier : y a-t-il une relation entre la table période et appartement ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Par défaut
    Ah oui désolé, c'était évident pour moi

    Donc, schémas simplifiés des 2 tables :

    Apartments
    ID
    name
    sleepings
    floorarea
    rooms
    ...

    Periods
    ID
    apartment_id (FK vers Apartments.id)
    start_date
    end_date
    ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Dans ce cas il serai interessant de faire une jointure entre la table appartement et periods dans votre sous-requete du not exists

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Par défaut
    Ok, merci c'est une piste que je pensais explorer car je l'ai vu dans plusieurs discussions ici, mais à chaque fois, il y avait une troisième table en jeu et la jointure se faisait entre la table periods et cette 3e table...

    Je vais faire quelques tests et reviendrai ici, soit pour donner ma solution, soit pour recueillir plus d'indices en cas d'échec

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 59
    Par défaut
    Bon en fait je ne trouvais pas la solution avec la jointure, mais j'ai pensé à une autre piste : faire un NOT IN au lieu d'un NOT EXISTS. Je ne sais pas si c'est propre et si cela peut couvrir tous les cas, merci de me donner votre avis.

    Voici la requête modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    SELECT `Apartment`.`id`, `Apartment`.`name`, `Apartment`.`sleepings`, `Apartment`.`rooms`, `Apartment`.`floorarea`
        FROM `apartments` AS `Apartment`
        WHERE `Apartment`.`is_online` = 1
            AND `Apartment`.`is_available_to_rent` = 1
            AND `Apartment`.`sleepings` >= 1
            AND `Apartment`.`city_id` = 2
            AND `Apartment`.`id` NOT IN (
                SELECT apartment_id
                FROM `periods` as `Period`
                WHERE
                    `Period`.`start_date` BETWEEN '2012-04-02' AND '2012-04-13'
                    OR `Period`.`end_date` BETWEEN '2012-04-02' AND '2012-04-13'
                    OR (
                        `Period`.`start_date` < '2012-04-02'
                        AND `Period`.`end_date` > '2012-04-13'
                    )
            );

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête de recherche de réservation dans une période
    Par niou142 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/05/2010, 11h54
  2. [Requête] Avoir zéro pour une Requête vide
    Par nicou50 dans le forum Requêtes et SQL.
    Réponses: 23
    Dernier message: 10/01/2007, 03h35
  3. Requête avec comparaison pour la date
    Par buzz! dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 10/08/2006, 17h00
  4. [SQL] Requête dificile à réaliser (pour moi)
    Par gunth dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/06/2006, 06h48
  5. [Requête SQL] Problème pour echantilloner
    Par jool dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/08/2005, 09h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo