Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en 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 05/10/2006, 17h16   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 10
Points : 1
Points : 1
Par défaut fonction MAX

Bonjour à tous,

Voilà mon problème : pour chaque valeur de A différente, je souhaite récupérer la valeur de B pour laquelle C=MAX(C), ex :

A=1,B=1,C=10
A=1,B=2,C=1
A=1,B=3,C=8

A=3,B=1,C=5
A=3,B=2,C=3
A=3,B=3,C=35

A=4,B=1,C=5
A=4,B=2,C=58
A=4,B=3,C=8

La requête doit retourner 3 valeurs :
B=1 car 10=MAX(10,1,8)
B=3 car 35=MAX(5,3,35)
B=2 car 58=MAX(5,58,8)

Je n'arrive pas à m'en sortir avec une seule requête, faut-il faire plusieurs requêtes ?

Merci pour votre aide.
angus42 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2006, 14h41   #2
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Peut-être avec un groupe et une jointure, mais pas sûr.

Ca donnerait

Code :
1
2
3
4
SELECT B FROM TABLE t1
LEFT JOIN TABLE t2
ON t1.C = MAX(t2.C)
GROUP BY t1.A,
A tester
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2006, 15h12   #3
Membre Expert
 
Avatar de Sivrît
 
Inscription : février 2006
Messages : 953
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2006
Messages : 953
Points : 1 189
Points : 1 189
Plus exactement:
Code :
1
2
3
4
5
 
SELECT t1.A, t1.B, t1.C, MAX(t2.C)
FROM TABLE t1 JOIN TABLE t2 ON t1.A = t2.A
GROUP BY t1.A
HAVING t1.C = MAX(t2.C)
'LEFT JOIN' est à éviter quand non nécessaire.
Les MAX et autres n'ont pas l'air de passer dans 'ON' et 'WHERE', donc c'est un 'HAVING'. Les champs utilisés pour la clause 'HAVING' doivent être listés (même s'ils ne nous intéressent pas vraiment).

Ca marche mais c'est assez lent. Si la table est vraiment énorme ça peut être un problème. Un index sur A me semble vital.
Sivrît 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 22h52.


 
 
 
 
Partenaires

Hébergement Web