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 :

Filtrer des éléments dans une table


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant BI
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant BI
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 23
    Points
    23
    Par défaut Filtrer des éléments dans une table
    Bonjour tout le monde !

    Je rencontre un petit problème pour filtrer des données.

    Je possède une table avec pour format :
    ID - Nom - Age - DateMAJ

    Une personne peut donc apparaître plusieurs fois, les lignes n'étant pas supprimées avant une nouvelle insertion.

    Je souhaiterais récupérer uniquement les lignes (complètes) de chaque agent avec la date de dernière mise à jour.

    Le problème est que je souhaite également récupérer le Nom et l'Age. Mais comme l'âge change d'une fois sur l'autre, je ne peux pas regrouper les lignes ensemble lors de la première requête. (Je ne peux pas remplacer l'âge par la date de naissance, même si ça simplifierai le problème).

    J'ai pensé faire qqc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID, MAX(DateMAJ) 
    FROM MaTable
    GROUP BY ID
    Puis je voulais recouper le résultat de cette requête avec la totalité de la table ... mais je ne vois pas bien où aller.

    Avez-vous une petite idée ?

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Pourquoi ne pas faire avec Age ce que tu fais avec DateMAJ , MAX(Age) ?

  3. #3
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    ta requête ne fera jamais ça... étant donné l'unicité évidente de id, c'est comme si tu écrivais:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(DateMaj) from MaTable

    il faudrait simplement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select nom,max(age) from MaTable group by nom

    entre nous laisser des doublons pour ce genre d'utilisation n'est vraiment pas une bonne chose: pourquoi faire que des insert plutot qu'un update ou un replace...?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant BI
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant BI
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Bonjour, et merci pour vos premières réponses.

    Mais en fait, mon problème est un peu plus compliqué que l'exemple que j'utilise. Je l'ai juste associé à cet exemple car je pense que ça colle à ce que je recherche.

    L'ID n'est pas unique, tout comme le nom. J'ai peut-être mal choisit le nom de colonne, il s'agirait d'une référence vers la personne (un matricule ?).

    Ainsi, je peux avoir dans ma table :

    01 - Dupond - 27 - 22/05/2008
    02 - Martin - 33 - 22/05/2008
    03 - Dupond - 26 - 22/05/2008
    01 - Dupond - 29 - 27/08/2010
    02 - Martin - 34 - 10/06/2009

    L'âge n'était qu'un exemple, le dernier n'est pas forcément le max. Par exemple, j'aurais pu mettre "DerniereNoteObtenu".

    La base est déjà alimentée (je repars d'un projet existant), je ne peux donc pas faire de update dans la table source. Par contre, je le ferai dans ma table cible (mais je dois quand même faire ce tri avant )

    C'est pour ça que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID, MAX(DateMAJ) FROM MaTable
    GROUP BY ID
    me renvoie bien :
    01 - 27/08/2010
    02 - 10/06/2009
    03 - 22/05/2008

    Mais après, je ne vois pas comment récupérer les lignes complètes (ici, il s'agirait donc de récupérer, en plus, le nom et l'âge de 01 pour la ligne du 27/08/2010, le nom et l'âge de 02 pour la ligne du 10/06/2009, etc ...).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Hello,

    Je me plante peu être car j'ai un peu de mal à voir ce qui ne va pas mais il me semble qu'il te suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT Id, Name, Age, MAX(DateMAJ) FROM MaTable
    GROUP BY ID

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant BI
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant BI
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Quand il y a plusieurs colonnes, je suis obligé de faire le GROUP BY sur l'ensemble des colonnes (sauf celle où j'indique "MAX").

    La colonne 'Nom' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

    La colonne 'Age' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
    Et si j'ajoute ces colonnes au GROUP BY, je garde les 5 lignes de ma table (vu que les âges sont différents).

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    d'où l'intérêt de travailler directement sur la vraie structure plutôt que des substitutifs...

    qu'on voit directement le mieux à faire

  8. #8
    Membre à l'essai
    Homme Profil pro
    Consultant BI
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant BI
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Je me suis dit que ça serait plus simple, vu qu'il faut avoir la vision métier précise, que la table en question possède une 60aine de champs, avec des noms pas toujours très parlant et que je dois faire les GROUP BY sur plusieurs colonnes en même temps.

    Je pense avoir simplifié le problème, de manière à pouvoir généraliser la solution à mon cas assez facilement après.

    J'ai essayé de faire une jointure externe avec elle même mais je galère un peu
    Mais bon, pas d'autre idée pour l'instant

  9. #9
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Ce genre de requete devrait vous aider a vous approcher de votre solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
    	b.Id, b.Nom, b.Age, B.laDate 
    FROM
    	laTable b 
    INNER JOIN 
    	(SELECT
    		Id, 
    		MAX(LaDate) as laDateMax
    	FROM
    		laTable
    	GROUP BY 
    	Id) a 	/* Derniere Mise a jour par Id */
    ON (a.id=b.id and a.laDatMax=b.laDate)		/* Recuperation du tuple verifiant la clause Id et Derniere maj */
    A tester et adapter.

    Bon courage

  10. #10
    Membre à l'essai
    Homme Profil pro
    Consultant BI
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant BI
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    C'est exactement ça, merci beaucoup !

    En plus j'étais presque passé par là ... mais quand je regarde ma requête, j'avais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (a.id=a.id AND a.laDatMax=b.laDate)
    d'où la requête qui ne marchait pas ... Erreur de frappe ...

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

Discussions similaires

  1. [MySQL] Filtrer des éléments d'une liste selon plusieures valeurs d'un champ d'une table bdd
    Par amdawb dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 08/02/2015, 16h59
  2. Réponses: 1
    Dernier message: 22/01/2008, 17h58
  3. Réponses: 2
    Dernier message: 15/06/2005, 18h32
  4. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 15h27
  5. Ordre des champs dans une table
    Par patapetz dans le forum Outils
    Réponses: 5
    Dernier message: 30/07/2003, 07h53

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