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 :

Problème de conception d'une requete avec BETWEEN


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de greg91
    Homme Profil pro
    Administrateur système
    Inscrit en
    Novembre 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut Problème de conception d'une requete avec BETWEEN
    Bonjour à tous,

    J'ai un problème avec un système de location immobilière. Je ne comprend pas pourquoi mes requêtes ne fonctionnent pas

    J'ai 2 tables

    Table annonce
    Stock des annonces de logements à louer (identifiant et référence)
    idAnnonce reference
    1 dupond
    2 albert

    Table joursLibres
    Stock les jours disponibles pour chaque logement (identifiants et dates ou les logements sont disponibles)
    idAnnonce date
    1 2015-06-06
    1 2015-06-07
    2 2015-06-06
    2 2015-06-07

    la requête avec une journée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT
    	`annonce`.`idAnnonce`, `annonce`.`reference` 
    FROM
    	`annonce`, `jourLibre` 
    WHERE
    	`annonce`.`idAnnonce` = `jourLibre`.`idAnnonce`
    AND
    	`jourLibre`.`date` = '2015-06-06'
    Me renvoie un résultat correct.

    Mais une requête sur plusieurs jours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT
    	`annonce`.`idAnnonce`, `annonce`.`reference` 
    FROM
    	`annonce`, `jourLibre` 
    WHERE
    	`annonce`.`idAnnonce` = `jourLibre`.`idAnnonce`
    AND
    	`jourLibre`.`date` = '2015-06-06'
    AND
    	`jourLibre`.`date` = '2015-06-07'
    Ne renvoi aucun résultat...

    Ou est mon erreur dans cette requête ?
    Comment faire pour lister les annonces disponible sur plusieurs jours ?

    PS : Ci-joint le dump SQL pour test
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 129
    Par défaut
    Ben oui faut utiliser OR...

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

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut
    Merci pour ton aide.

    J'y suis presque avec une requête comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT a.idAnnonce, a.reference
    FROM annonce a
    INNER JOIN joursLibres f ON a.idAnnonce = f.idAnnonce
    WHERE f.date
    BETWEEN '2015-08-01'
    AND '2015-08-08'
    Mais il y a un problème. Lorsqu’une date manque dans l'intervalle, l'annonce est quand même sélectionnée. Ce que je ne veux pas puisqu'il manque un jour de disponibilité.
    J'ai aussi testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT a.idAnnonce, a.reference
    FROM annonce a
    INNER JOIN joursLibres f ON a.idAnnonce = f.idAnnonce
    WHERE f.date
    IN (
    '2015-08-01', '2015-08-02', '2015-08-03', '2015-08-04', '2015-08-05', '2015-08-06', '2015-08-07', '2015-08-08'
    )
    Mais c'est pareil, si il manque une date (2015-08-04 par exemple), l'annonce est quand même sélectionnée.

    Moi je voudrai que toute les dates de l'intervalle soient présente pour que l'annonce soie sélectionnée

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 129
    Par défaut
    Désolé j'avais pas compris, s'il faut vérifier que l'annonce existe à toutes les dates c'est pas si simple !

    Il faut soit tester chaque date avec un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id, ref from annonce a where exists (select * from jourslibres f where a.idAnnonce = f.idAnnonce and f.date=...) and exists ...
    Plus simple compter le nombre de jours libres (8 dans ton exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id, ref, count(*) from annonce inner join jourslibres on ... where date between ...) group by id, ref having count(*)=8
    Par ailleurs appeler "date" un champ date c'est pas une bonne idée

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

    Informations professionnelles :
    Activité : Administrateur système

    Informations forums :
    Inscription : Novembre 2007
    Messages : 121
    Par défaut
    @nico84 Désolé j'avais pas compris, s'il faut vérifier que l'annonce existe à toutes les dates c'est pas si simple !
    Quand je me relis, je me dis que tu as vraiment du mérite d'avoir compris ce que je souhaitais

    En tous cas, tu es mon sauveur car ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select a.idAnnonce, a.reference
    from annonce a 
    where exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-01-01') 
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-02') 
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-03') 
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-04') 
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-05')
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-06') 
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-07')
    and exists (select `date` from jourLibre f where a.idAnnonce = f.idAnnonce and f.date='2015-08-08')
    Semble donner le résultat escompté.
    EDIT : C'est cette forme de requête que j'ai utilisé.

    Et celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.idAnnonce, a.reference, count( * )
    FROM annonce a
    INNER JOIN jourLibre f ON a.idAnnonce = f.idAnnonce
    WHERE date
    BETWEEN '2015-08-01'
    AND '2015-08-08'
    GROUP BY a.idAnnonce, a.reference
    HAVING count( * ) =8
    Semble fonctionner aussi ! (Et la franchement fallait y penser)

    Du coup, je me retrouve avec 2 solutions et étudier pour mon problème de moteur de recherche à voir pour les performances maintenant.

    Merci beaucoup nico84. Ça fait du bien de pas se sentir seul devant son clavier.

    @nico84 Par ailleurs appeler "date" un champ date c'est pas une bonne idée
    Aie, mais pourquoi ? confusion ?

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 129
    Par défaut
    Citation Envoyé par greg91 Voir le message
    (Et la franchement fallait y penser)
    J'avoue que j'étais plutot fier
    Citation Envoyé par greg91 Voir le message
    Aie, mais pourquoi ? confusion ?
    Ben oui...

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

Discussions similaires

  1. Probléme de jointure dans une requete avec UNION
    Par MissOleana dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/11/2013, 15h45
  2. Réponses: 2
    Dernier message: 07/08/2008, 12h17
  3. Réponses: 12
    Dernier message: 23/05/2007, 10h37
  4. Problème sur une requete avec champ date
    Par islande dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2006, 19h39
  5. Problème export excel sur une requete avec critère
    Par eddyG dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 20/09/2006, 11h46

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