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 de type 1,n avec date


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut Requête de type 1,n avec date
    Bonjour, je m'y connais assez bien en SQL mais je tombe sur un cas que je n'arrive pas trop à résoudre proprement.

    Je vous explique le problème avec un bon exemple.

    J'ai une table personne et une table logement.

    Personne(Id)
    Logement(Id, IdPersonne, DateDebut, DateFin)

    Une personne possède plusieurs logements à différentes dates.
    J'ai simplifié le problème au possible.

    Mon problème est que je voudrais la liste des personnes avec leur premier logement.
    Je peux donc faire une requête de ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.Id, L.DateDebut, L.DateFin
    FROM Personne AS P, Logement AS L
    WHERE P.Id = L.IdPersonne
    GROUP BY P.Id
    Cette requête me permet donc d'avoir une ligne par personne et d'avoir le premier logement dans la base, ce qui n'est pas forcement le logement le plus vieux.

    Auriez-vous une solution à me proposer pour avoir le logement le plus ancien de la personne ?
    Je pense qu'il y a une façon simple de le faire que je ne vois pas.

    PS : désolé pour le titre je ne savais pas trop comment résumer ma demande.

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    MIN(DateDebut) et GROUP BY idPersonne, ça devrait aider non ?

    Donc on va d'abord chercher la première date de début de chaque personne dnas la table logement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IdPersonne, MIN(DateDebut) AS PremDateDebut
    FROM Logement
    GROUP BY IdPersonne
    Ensuite on utilise ce résultat pour récupérer les autres informations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT L1.IdPersonne, L1.Id AS IdLogement, L1.DateDebut, L1.DateFin
    FROM Logement L1
    INNER JOIN (
      SELECT L2.IdPersonne, MIN(L2.DateDebut) AS PremDateDebut
      FROM Logement L2
      GROUP BY L2.IdPersonne
    ) tmp ON L1.IdPersonne = tmp.IdPersonne AND L1.DateDebut = tmp.PremDateDebut

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    J'avais jamais essayé de mettre une requête à la place d'une table, c'est très pratique, le problème c'est que la base est MySQL 3 et n'accepte pas les requêtes imbriquées.

    Au mieux il faudrait un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IdPersonne, MIN(DateDebut) AS PremDateDebut, Type
    FROM Logement
    GROUP BY IdPersonne
    Le problème c'est que dans ce cas-là, le champs type n'est pas forcement le même enregistrement que celui de PremDateDebut. Il faudrait que les champs soient solidaires.

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    1ère solution : Mettre à jour MySQL. La version actuelle est quand même la 5 ! La 3 est un dinosaure à l'échelle des temps informatiques !

    2ème solution : Si la version 3 l'accepte, il faut faire une table temporaire avec la sous-requête et faire la jointure sur cette table temporaire.

    3ème solution : Si la version 3 n'accepte pas les tables temporaires, il faut créer une table réelle avec la sous-requête puis faire la jointure sur cette table et éventuellement supprimer la table ensuite.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    OK, c'est bien ce que je craignais.

    Malheureusement ce n'est pas à moi de choisir pour la mise à jour sinon ça fait longtemps que ça aurait été fait.

    Merci de ton aide.

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

Discussions similaires

  1. [AC-2002] Requête SQL avec date => Incompatibilité de type
    Par waici dans le forum VBA Access
    Réponses: 3
    Dernier message: 31/08/2009, 10h59
  2. Problème avec date dans requête
    Par alain94 dans le forum Access
    Réponses: 2
    Dernier message: 22/05/2006, 08h49
  3. Réponses: 4
    Dernier message: 13/02/2006, 19h58
  4. Problème de requête avec dates
    Par charleshbo dans le forum Access
    Réponses: 4
    Dernier message: 08/02/2006, 01h17
  5. Requête avec dates
    Par skyman272 dans le forum Access
    Réponses: 11
    Dernier message: 30/01/2006, 11h16

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