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

Requêtes MySQL Discussion :

Requete de sélection simple mais je n'y arrive pas [MariaDB]


Sujet :

Requêtes MySQL

  1. #1
    Membre actif Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 208
    Points
    208
    Par défaut Requete de sélection simple mais je n'y arrive pas
    Bonjour à tous,

    J'ai 2 tables

    dlocSaison : stock des maisons en location
    idDlocSaison reference
    1 référence 1
    2 référence 2


    DlocSaisonPlanningChangeover : Stock les jours ou les entrés/sortie sont possible (C : entrée et sortie possible | I : entrée possible | O : Sortie possible | X : pas d'entée ni de sortie)

    idDlocSaison date etat
    1 2019-06-23 I
    1 2019-06-24 X
    1 2019-06-25 X
    1 2019-06-26 C
    1 2019-06-23 X
    1 2019-06-24 C
    1 2019-06-25 C
    1 2019-06-26 C

    J'ai une date d'arrivée le 2019-06-23 et de départ le 2019-06-26.
    Je souhaites donc récupérer les id de biens remplissants les conditions
    • date d'arrivée = 2019-06-23 ET etat = I ou C
    • date de départ = 2019-06-26 ET etat = I ou C


    En écrivant cette demande je me rend compte de ma nullité mais j'ai passé une 10aine d'heures avec des EXIST, UNION, sous requêtes... mais je n’arrive à rien.
    Soit je n'ai aucun résultat soit j'en ai trop.

    Voilà un de mes essai :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    SELECT DISTINCT
    	`dlocSaison`.`idDlocSaison`,
            `dlocSaison`.`reference`,
    	`dlocSaisonPlanningChangeover`.`date`,
    	`dlocSaisonPlanningChangeover`.`etat`,
     
    FROM
    	`dlocSaison`,
    	`dlocSaisonPlanningChangeover`
     
    WHERE `dlocSaison`.`idDlocSaison` = `dlocSaisonPlanningChangeover`.`idDlocSaison` 
    AND `dlocSaisonPlanningChangeover`.`date` IN ('2019-06-23','2019-06-29')
    AND `dlocSaisonPlanningChangeover`.`etat` IN ('C', 'I', 'O')
     
    AND (
     
     EXISTS (
     
        SELECT `dlocSaisonPlanningChangeover`.`date`
        FROM `dlocSaison`, `dlocSaisonPlanningChangeover` 
        WHERE `dlocSaison`.`idDlocSaison` = `dlocSaisonPlanningChangeover`.`idDlocSaison`
        AND `dlocSaisonPlanningChangeover`.`date` = '2019-06-23'
        AND `dlocSaisonPlanningChangeover`.`etat` IN ('C', 'I')
     
        )
     
    AND EXISTS (
        SELECT `dlocSaisonPlanningChangeover`.`date`  
        FROM `dlocSaison`, `dlocSaisonPlanningChangeover` 
        WHERE `dlocSaison`.`idDlocSaison` = `dlocSaisonPlanningChangeover`.`idDlocSaison`
        AND `dlocSaisonPlanningChangeover`.`date` = '2019-06-29'
        AND `dlocSaisonPlanningChangeover`.`etat` IN ('C', 'O')
        )
     
    )
    Merci !!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Il vous faut une table de date pour résoudre ce problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE T_PLANNING_PLN 
    (PLN_DATE        DATE PRIMARY KEY);
    Que vous allez remplir avec toutes les dates.....

    Puis la requête va devenir simple :
    1) jointure avec cette table de date avec BETWEEN dans le ON du JOIN
    2) prédicat NOT exists avec en sous requête la table DlocSaisonPlanningChangeover corrélée avec PLN_DATE.

    A +

  3. #3
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 792
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    En faisant "apparaitre" plusieurs fois la table dlocSaisonPlanningChangeover, une fois pour les arrivées, une fois pour les départs, ça devrait pouvoir le faire :
    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
    SELECT DISTINCT
        LOC.idDlocSaison
        ,LOC.reference
        ,ARR.date
        ,ARR.etat
        ,DEP.date
        ,DEP.etat
    FROM
        dlocSaison LOC
        inner join dlocSaisonPlanningChangeover ARR on ARR.idDlocSaison = LOC.idDlocSaison
        inner join dlocSaisonPlanningChangeover DEP on DEP.idDlocSaison = LOC.idDlocSaison
    WHERE   
            ARR.etat in ('I','C')
        AND DEP.etat in ('O','C')
        AND ARR.date = STR_TO_DATE('23/06/2019','%d/%m/%Y')
        AND DEP.date = STR_TO_DATE('29/06/2019','%d/%m,%Y')
    Ceci dit, il me semble que les conditions ne sont pas suffisantes car on ne tient pas compte d'une indisponibilité éventuelle du logement pendant la période considérée.
    Imaginons que la semaine 25 soit louée et qu'un client demande de la semaine 24 à la semaine 26, telle quelle la requête sortira le logement.

    Dites nous en plus sur ce comment vous gérez ça.

  4. #4
    Membre actif Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 208
    Points
    208
    Par défaut
    Merci Michel et SQLPro pour vos réponses.

    Ceci dit, il me semble que les conditions ne sont pas suffisantes car on ne tient pas compte d'une indisponibilité éventuelle du logement pendant la période considérée.
    Imaginons que la semaine 25 soit louée et qu'un client demande de la semaine 24 à la semaine 26, telle quelle la requête sortira le logement.
    Dites nous en plus sur ce comment vous gérez ça.
    Effectivement, il y a une 3eme table, celles des plannings de disponibilités. J'ai voulu simplifier la problématique, je ne pensais pas qu'elle serait utile :

    DlocSaisonPlanning : Stock les intervalles de dates ou les biens sont disponibles.

    idDlocSaison dateDebut dateFin
    1 2019-06-09 2019-06-10
    1 2019-06-21 2019-07-05
    1 2019-07-14 2019-07-19
    1 2019-08-25 2019-08-30
    1 2019-09-15 2019-11-01

    Initialement il n'y avait que cette table car les locations étaient toujours du samedi au samedi et c'était relativement simple. J'avais l'intention de compléter la requête avec cette partie une fois la problématique qui m’amène ici résolue.
    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
    19
    20
    21
    22
    23
     
    SELECT DISTINCT
            `dlocSaison`.`idDlocSaison`,
            `dlocSaison`.`reference`,
    FROM
            `dlocSaison`,
            `dlocSaisonPlanning`
    WHERE 
            `dlocSaison`.`idDlocSaison` = `dlocSaisonTarif`.`idDlocSaison` 
            AND `dlocSaison`.`idDlocSaison` = `dlocSaisonPlanning`.`idDlocSaison` 
            AND (
                '2019-06-09'
                BETWEEN
                    CAST(`dlocSaisonPlanning`.`dateDebut` AS DATE)
                    AND CAST(`dlocSaisonPlanning`.`dateFin` AS DATE)
             )
     
            AND (
                '2019-06-14'
                BETWEEN
                    CAST(`dlocSaisonPlanning`.`dateDebut` AS DATE)
                    AND CAST(`dlocSaisonPlanning`.`dateFin` AS DATE)
             )
    La table dlocSaisonPlanningChangeover à été ajoutée pour faire de la location courts séjours (concurrence airBnB oblige...)

    @SQLPro Désolé mais je ne comprends pas. J'ai bien une table avec toutes les dates et l'état des jours avec entre/sortie possible ou non...
    Le niveau est trop élevé pour moi je pense

    @Michel Vous voulez dire qu'il me faudrait une table pour les arrivées et une autre pour les départs (ARR et DEP) ?
    Je sèche car certains jour sont en départ ET arrivée possible (code C) je les insères dans les 2 tables ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 792
    Points : 1 511
    Points
    1 511
    Par défaut
    Citation Envoyé par greg91 Voir le message
    @Michel Vous voulez dire qu'il me faudrait une table pour les arrivées et une autre pour les départs (ARR et DEP) ?
    non, pas du tout et surtout pas !

    J'ai juste tenté d'expliquer ma démarche pour faire la requête SQL.
    Est-ce qu'elle donne le résultat attendu malgré la problématique soulevée ?

  6. #6
    Membre actif Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 208
    Points
    208
    Par défaut
    Est-ce qu'elle donne le résultat attendu malgré la problématique soulevée ?
    Je n'arrive pas à l'adapter.

    LOC = la table dlocSaison ?
    Que repésente ARR et DEP ?

    Je suis complètement perdu

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 792
    Points : 1 511
    Points
    1 511
    Par défaut
    Re,

    Justement ARR et DEP sont 2 projections de la même table dlocSaisonPlanningChangeover.

    En filtrant dlocSaisonPlanningChangeover sur son état et sur la date d'arrivée (23/06/2019) on à la projection ARR (diminutif de arrivée)
    Et on fait de même pour DEP.

    Les locations sont bien celles qui ont à la fois un état I ou C correspondant à la date d'arrivée ET un état O ou C à la date de départ.

    On reparlera des indisponibilités d'intervalle ce soir.

  8. #8
    Membre actif Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 208
    Points
    208
    Par défaut
    J'ai essayé votre requête (Désolé il m'a fallu un certain temps pour comprendre que je pouvais l'utiliser tel quel )

    J'ai mis des dates ou je suis sur d'avoir des disponibilités (du 03/10/2019 au 10/10/2019) mais elle ne me renvoie aucun résultat :

    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
     
    SELECT DISTINCT
        LOC.idDlocSaison
        ,LOC.reference
        ,ARR.date
        ,ARR.etat
        ,DEP.date
        ,DEP.etat
    FROM
        dlocSaison LOC
        inner join dlocSaisonPlanningChangeover ARR on ARR.idDlocSaison = LOC.idDlocSaison
        inner join dlocSaisonPlanningChangeover DEP on DEP.idDlocSaison = LOC.idDlocSaison
    WHERE   
            ARR.etat in ('I','C')
        AND DEP.etat in ('O','C')
        AND ARR.date = STR_TO_DATE('03/10/2019','%d/%m/%Y')
        AND DEP.date = STR_TO_DATE('10/10/2019','%d/%m,%Y')
    Voila le jeux de donnée qui fait penser que l'ID annonce 65 devrait sortir :

    Table dlocSaison :

    idDlocSaison reference
    65 Erika

    Table dlocSaisonPlanningChangeover
    idDlocSaison date etat
    65 2019-10-03 C
    65 2019-10-04 X
    65 2019-10-05 X
    65 2019-10-06 X
    65 2019-10-07 X
    65 2019-10-08 X
    65 2019-10-09 X
    65 2019-10-10 C
    65 2019-10-11 X
    65 2019-10-12 X

    Merci encore pour votre aide. Je continu à chercher le pourquoi.
    Je peux fournir les dump des tables si cela peut aider.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 792
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    J'ai peut être fait du zèle avec la fonction date, refaites la clause where comme d'hab

    Peut être, il peut être utile de fournir la structure de la table.

  10. #10
    Membre actif Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Points : 208
    Points
    208
    Par défaut
    YES, cela fonctionne !!
    Ya plus qu'à compléter avec les dispos, les prix, la piscine...

    Merci encore Michel !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT LOC.idDlocSaison, LOC.reference, ARR.date, ARR.etat, DEP.date, DEP.etat
    FROM dlocSaison LOC
    INNER JOIN dlocSaisonPlanningChangeover ARR ON ARR.idDlocSaison = LOC.idDlocSaison
    INNER JOIN dlocSaisonPlanningChangeover DEP ON DEP.idDlocSaison = LOC.idDlocSaison
    WHERE ARR.etat
    IN (
    'I', 'C'
    )
    AND DEP.etat
    IN (
    'O', 'C'
    )
    AND ARR.date = '2019-10-03'
    AND DEP.date = '2019-10-10'

  11. #11
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 792
    Points : 1 511
    Points
    1 511
    Par défaut
    Citation Envoyé par greg91 Voir le message
    Merci encore Michel !!
    De rien.
    Quoiqu'un petit +1 voire de marquer le post comme résolu (ou les 3) serait cool

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

Discussions similaires

  1. [AC-2007] requête Access simple mais je n'y arrive pas
    Par dstyx dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/12/2017, 11h02
  2. Réponses: 9
    Dernier message: 08/04/2015, 19h33
  3. Requête simple mais je n'y arrive pas
    Par redah75 dans le forum Débuter
    Réponses: 4
    Dernier message: 15/03/2011, 06h15
  4. [PHP 5.2] [Mail] mail(): pas d'erreurs, mais les mails n'arrivent pas
    Par lvr dans le forum Langage
    Réponses: 3
    Dernier message: 27/04/2009, 11h29

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