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 :

En fontion d'une personne, recuperer les 2 lignes les plus anciennes.


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 35
    Points : 22
    Points
    22
    Par défaut En fontion d'une personne, recuperer les 2 lignes les plus anciennes.
    Bonjour à tous,

    Je vous expose mon probleme :
    J'ai une vue regroupant les données suivantes :
    NumDoss | valeur1 | Valeur 2 | Date


    Il existe plusieurs enregistrements pour chaque NumDoss

    Et en fait, je souhaite récupérer les 2 plus anciens enregistrements pour chaque NumDoss....
    J'essaie depuis un moment mais en vain....

    Je réussis a faire un requete pour la plus ancienne, mais n'arrive pas a cumuler les 2.


    Si qqn a une idée

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par nicko5959
    Bonjour à tous,

    Je vous expose mon probleme :
    J'ai une vue regroupant les données suivantes :
    NumDoss | valeur1 | Valeur 2 | Date


    Il existe plusieurs enregistrements pour chaque NumDoss

    Et en fait, je souhaite récupérer les 2 plus anciens enregistrements pour chaque NumDoss....
    J'essaie depuis un moment mais en vain....

    Je réussis a faire un requete pour la plus ancienne, mais n'arrive pas a cumuler les 2.


    Si qqn a une idée
    je sais pas si ça peut t'aider je suis peut être hors-sujet mais un truc genre
    select * from 'nomdetatable' order by Date asc limit 0,2
    ça marche pas ?

  3. #3
    Membre régulier
    Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2003
    Messages : 94
    Points : 116
    Points
    116
    Par défaut
    bonjour,

    Peux tu préciser la version de MYSQL ?
    4.0
    4.1 ou +

    Merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    Version 5.0 de mySQL.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 72
    Points : 71
    Points
    71
    Par défaut
    Donnes-nous voir plus de précisions sur la structure de ta table, type des champs etc... Sinon d'aprés ce que j'ai compris, il faudrais que tu fasse une requête du genre :

    SELECT NumDoss FROM ta_table GROUP BY NumDoss ORDER BY NumDoss
    Qui te liste touts les NumDoss identiques de ta base

    ensuite tu boucles sur le résultat avec la requête suivante :

    SELECT Valeur1, Valeur2 FROM ta_table WHERE NumDoss=#Numboss_renvoyé ORDER BY date DESC LIMIT 0,2

    En espérant t'avoir apporté une solution ...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    Merci pour les reponses :
    La structure de ma table :
    NumDoss (entier NNNNN)
    Epworth (entier NN)
    Eva1 (entier)
    Date ( Date ddmmaaaa)

    Il n'y a pas de clé unique sur cette table.

    Chaque NumDoss possede un ou plusieurs enregistrements avec des dates différentes (délai entre 2 dates entre 15 jours et 3 mois)
    Je vais tester ta soluc bigben

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    BigBen, Ton idée est très bien, mais dans ta seconde requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Valeur1, Valeur2 FROM ta_table WHERE NumDoss=#Numboss_renvoyé ORDER BY date DESC LIMIT 0,2
    le pb reste de créé la boucle qui va faire cette requete pour chaque NumDoss retourné de ta premiere requete.

    Car en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Valeur1, Valeur2 FROM ta_table WHERE NumDoss=(SELECT NumDoss FROM ta_table GROUP BY NumDoss ORDER BY NumDoss) ORDER BY date DESC LIMIT 0,2
    Est bien la requete secondaire retoune plus d'une reponse donc ca ne va pas.
    Il faudrai faire une boucle du style et en brut:

    Pour chaque NumDoss, Ajouter a la table resultat
    SELECT Valeur1, Valeur2 FROM ta_table WHERE NumDoss=(NuMDossEnCours) ORDER BY date DESC LIMIT 0,2

    Fin Pour


    Mais est-ce possible sous MySQL?

  8. #8
    Membre régulier
    Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2003
    Messages : 94
    Points : 116
    Points
    116
    Par défaut
    A condition que pour 1 numDoss, il n'y ait pas 2 fois la même date et sous réserve que la table ne soit pas trop volumineuse, 1 solution possible en 1 requête :

    SELECT NumDoss, MIN(Date) FROM Table
    group by 1
    UNION
    SELECT R.NumDoss, MIN(Date) FROM Table R,
    (SELECT NumDoss, MIN(Date) MIN_ARRIVEE FROM Table group by 1) T
    where R.NumDoss=T.NumDoss and R.Date > T.Date
    group by 1
    order by 1,2

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    J'ai trouvé la solution !

    Il faut utiliser du pl-sql avec des curseurs.

    Comme suit par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE stat.Question13ok()
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE Num CHAR(6);
    DECLARE cur1 CURSOR FOR SELECT NumDoss FROM stat.popucible GROUP BY NumDoss ORDER BY NumDoss;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    OPEN cur1;
    REPEAT
          FETCH cur1 INTO Num;
          INSERT INTO stat.Question13(NumDoss,Epworth,Epworth_1,Eva1,Eva1_1,datEntree2,datEntree2_1) VALUES ((SELECT p1.NumDoss FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 0,1),(SELECT p1.Epworth FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 0,1),(SELECT p1.Epworth FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 1,1),(SELECT p1.Eva1 FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 1,1),(SELECT p1.Eva1 FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 1,1),(SELECT p1.datEntree2 FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 0,1),(SELECT p1.datEntree2 FROM stat.popuCible p1 Where p1.NumDoss = Num ORDER BY p1.NumDoss, p1.DatEntree2 ASC LIMIT 1,1));
    UNTIL done END REPEAT;
    CLOSE cur1;
    END $$
    Pour gagner du temps, au lieu de faire les requete dans le INSERT, on peux faire des table temporaire.

    Merci à vous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/11/2012, 20h51
  2. Réponses: 13
    Dernier message: 09/05/2011, 11h20
  3. Réponses: 12
    Dernier message: 03/03/2009, 09h01
  4. Réponses: 4
    Dernier message: 11/09/2006, 16h55

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