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 08/11/2011, 17h07   #1
Membre du Club
 
Inscription : février 2007
Messages : 187
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 187
Points : 41
Points : 41
Par défaut Recuperation de valeur par date la plus récente (pour une association de plusieurs colonnes)

Bonjour,

J'ai une table "maTable",
Qui contient 6 colonnes:
Code :
ID, COL_1, COL_2,COL_3,VALEUR,DATE
Je voudrais récupérer le champ VALEUR pour chaque groupe de (COL_1, COL_2,COL_3) ayant la date la plus récente.

Impossible de trouver une requête efficace...
J'ai essayer ceci :
Code SQL :
SELECT VALEUR FROM maTable WHERE DATE IN (SELECT max(DATE) FROM maTable  GROUP BY COL_1, COL_2,COL_3)

Mais je sais que ce n'est pas la bonne solution (d’ailleurs les valeurs retournées ne sont pas bonnes)

Merci d'avance pour vos réponses.
Neilime05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 17h54   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 646
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 646
Points : 2 643
Points : 2 643
MySql c'est pas terrible pour ce genre de requête.

Essayez ceci :

Code :
1
2
3
4
5
6
7
8
 
SELECT VALEUR 
FROM maTable t1
WHERE DATE = (
	SELECT max(DATE) 
	FROM maTable t2 
	WHERE t1.CHAMP_1 = t2.CHAMP_1 AND t1.CHAMP_2 = t2.CHAMP_2 AND t1.CHAMP_3 = t2.CHAMP_3
	GROUP BY CHAMP_1, CHAMP_2,CHAMP_3)
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 08h24   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT t1.col_1, t1.col_2, t1.col_3, t1.col_date, t1.valeur
FROM la_table t1
INNER JOIN
(
	SELECT t2.col_1, t2.col_2, t2.col_3, MAX(la_date) AS date_max
	FROM la_table t2
	GROUP BY t2.col_1, t2.col_2, t2.col_3
) tmp 
	ON tmp.col_1 = t1.col1
	AND tmp.col_2 = t1.col_2
	AND tmp.col_3 = t1.col_3
	AND tmp.date_max = t1.la_date
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/11/2011, 15h43   #4
Membre du Club
 
Inscription : février 2007
Messages : 187
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 187
Points : 41
Points : 41
La réponse de CinePhil marche bien (désolé pour l'utilisation du mot champ ), merci.

Il ne me reste plus qu'une contrainte pour résoudre définitivement cette problématique :

Une des colonnes "t1.col_1, t1.col_2, t1.col_3" peut être nulle, je doit cependant pouvoir les récupérer.

J'ai essayer avec RIGHT JOIN au lieu du INNER JOIN, mais rien n'y fait...
Besoin d'encore un peu d'aide.
Merci d'avance.
Neilime05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 17h34   #5
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 426
Points : 6 426
Bonjour,

Pour faire ce que vous souhaitez, on peut mettre dans la condition de jointure un COALESCE avec, en deuxième argument, une valeur que ne peut pas prendre chaque colonne.

Si on disposait au moins du type de chaque colonne, ça serait plus simple pour vous aider.
Disons que chacune des ces 3 colonnes est de type entier, et qu'elles ne peuvent prendre que des valeurs positives.
Dans ce cas, chaque colonne ne peut pas valoir -1 (par exemple), et la requête devient :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT t1.col_1, t1.col_2, t1.col_3, t1.col_date, t1.valeur
FROM la_table t1
INNER JOIN
(
	SELECT t2.col_1, t2.col_2, t2.col_3, MAX(la_date) AS date_max
	FROM la_table t2
	GROUP BY t2.col_1, t2.col_2, t2.col_3
) tmp 
	ON COALESCE(tmp.col_1, -1) = COALESCE(t1.col1, -1)
	AND COALESCE(tmp.col_2, -1) = COALESCE(t1.col_2, -1)
	AND COALESCE(tmp.col_3, -1) = COALESCE(t1.col_3, -1)
	AND tmp.date_max = t1.la_date
A vous d'adapter en fonction du type et des valeurs possibles de chaque colonne...
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/11/2011, 08h58   #6
Membre du Club
 
Inscription : février 2007
Messages : 187
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 187
Points : 41
Points : 41
Avec un COALESCE cela fonctionne très bien. Merci ced !
Mes colonnes sont de type varchar donc je ne voyait pas trop ce que je pouvais mettre comme valeur que ne peut pas prendre chaque colonne donc j'ai laissé "-1" et je doit me contraindre à ne pas mettre "-1" dans colonnes.
Neilime05 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 14h28.


 
 
 
 
Partenaires

Hébergement Web