Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2011, 18h29   #1
Candidat au titre de Membre du Club
 
Homme
Consultant junior BI
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant junior BI
Secteur : Conseil

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 11
Points : 11
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 :
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 ?
Lobay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 19h55   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Pourquoi ne pas faire avec Age ce que tu fais avec DateMAJ , MAX(Age) ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 20h08   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 852
Points : 1 330
Points : 1 330
salut,

ta requête ne fera jamais ça... étant donné l'unicité évidente de id, c'est comme si tu écrivais:
Code sql :
SELECT max(DateMaj) FROM MaTable

il faudrait simplement:
Code sql :
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...?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 09h35   #4
Candidat au titre de Membre du Club
 
Homme
Consultant junior BI
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant junior BI
Secteur : Conseil

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 11
Points : 11
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 :
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 ...).
Lobay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 10h04   #5
Invité régulier
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 7
Points : 7
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 :
1
2
3
 
SELECT Id, Name, Age, MAX(DateMAJ) FROM MaTable
GROUP BY ID
misthuko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 10h11   #6
Candidat au titre de Membre du Club
 
Homme
Consultant junior BI
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant junior BI
Secteur : Conseil

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 11
Points : 11
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").

Citation:
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).
Lobay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h02   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 852
Points : 1 330
Points : 1 330
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
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 11h16   #8
Candidat au titre de Membre du Club
 
Homme
Consultant junior BI
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant junior BI
Secteur : Conseil

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 11
Points : 11
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
Lobay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h38   #9
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Ce genre de requete devrait vous aider a vous approcher de votre solution
Code :
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
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/06/2011, 10h31   #10
Candidat au titre de Membre du Club
 
Homme
Consultant junior BI
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant junior BI
Secteur : Conseil

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 11
Points : 11
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 :
(a.id=a.id AND a.laDatMax=b.laDate)
d'où la requête qui ne marchait pas ... Erreur de frappe ...
Lobay est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h41.


 
 
 
 
Partenaires

Hébergement Web