Page 1 sur 1

min d'une colonne et selection d'une autre

Posté : 04 juil. 2009, 11:08
par pierreC
Hello à tous,

J'ai un problème récurent, que je résoud par deux solutions que je vais exposé mais qui sont à mon gout beaucoup trop compliqué.

J'ai une table :

Code : Tout sélectionner

email / prenom / age [email protected] , titi , 16 [email protected] , juju , 24 [email protected] , pierre , 12 [email protected] , eric , 10
Je dois faire une agrégation (group by) sur email, récupérer le min de l'age et le prenom associé (et c'est là que c'est dur)
cela me donnerait : Mais si j'ecris SELECT email,prenom,min(age) FROM client GROUP BY email , ca ne me récupère pas avec certitude le non prénom.


1ere sol trouvé récupérer d'abord l'id des lignes sans le prénom puis refaire une jointure pour récupérer le prénom
2eme sol faire une table temporaire trié par age, et le résultat du group by ne sélectionnera que la 1ere ligne (c'est pas beau mais ca marche)

Mais l'une ou l'autre solution deviennent tres lourde quand j'ai 20 colonnes

Des idées ?


Merci

[/quote]


PS : merci de ne pas débattre sur la structure de la table, cela provient d'une source externe sur laquelle je n'ai pas la main.

Posté : 05 juil. 2009, 15:42
par enneite
tu as plusieurs nom, prenom par email???
je comprends pas trop ce que tu souhaites obtenir en lignes final.
une ligne ou plusieurs?
tu souhaites obtenir l'email le prenom de la personne avec le plus jeune age??
(ce serait select prenom,email,age from tatable order by age limit 1 )
si tu veux faire un regroupement par email (et je trouve ça bizzard qu'un email soit associé a plusieurs prenoms en ne recuperant que le plus petit age à chaque fis, tu peux essayer ceci:
SELECT email,prenom,age FROM client GROUP BY email ORDER BY age
)

Posté : 05 juil. 2009, 16:00
par Patriboom
Si t'as plusieurs noms / prénoms possibles pour une seule adresse de courriel, tu pourrais faire un SELECT DISTINCT, ainsi tu aurais autant d'occurrences d'une adresse qu'il y aurait de noms associés.

SELECT DISTINCT prenom,nom, min(age) blabla

Posté : 05 juil. 2009, 18:32
par pierreC
Merci pour vos réponses,

Ces données proviennent d'une base non fiable, par exemple des personnes répondant à des sondage, et 1 jour ils vont fournir un mail avec un prenom et leur age, et parfois avec le même mail fournir le prénom de leur femme avec l'age de leur femme.

Avec cette base je dois faire du mailling, et donc pour récupérer les mails de manière unique, avec l'age minimu, et le prénom associé à cette ligne.

Y'a peut etre des idées sur cette page : http://dev.mysql.com/doc/refman/5.0/fr/ ... p-row.html
mais malheuresement il est ecrit "mais en utilisant une astuce inefficace que j'appelle ``astuce du MAX-CONCAT'' sans donner l'explication du pourquoi "inefficace"

Dans mon ca ca donnerai une requete comme cela :
SELECT email, SUBSTRING( MIN( CONCAT(LPAD(age,6,'0'),prenom) ), 7) AS prenom, min(age) FROM client GROUP BY email
explication : on ajoute l'age devant le prenom, on prend le min de cette nouvelle colonne, puis on retire l'age ajouté. le LPAD permettant de maitriser le nombre de zero ajouté et donc combien de caractère à retirer.


Des idées sur ce code, ou sur d'autre pour résoudre mon problème ?


EDIT 10 jours plus tard : ce code tourne en prod, vraiment très pratique, n'ayant par contre aucun besoin en perfomance je n'ai effectué aucune mesure à ce sujet (mais ca répond très vite qd même)

Merci