Page 1 sur 1

agrégation sur valeur

Posté : 30 mars 2009, 16:28
par pierreC
Hello,

Si le titre etait facile à écrire la recherche google le serait aussi. Je viens donc ici poser ma question.

j'ai une table de commandes avec 3 colonnes, id_cl, date, type_achat.
J'ai besoin d'effectuer une requete qui me retournera les clients de maniere unique selon 2 critères et un regroupement.

Raisonnement etape par etape :
Regroupement d'bord sur l'id_cl, avec une agrégation sur max(date). Jusque là c'est pas dure la requete est :
SELECT id_cl,max(date) FROM commande GROUP BY id_cl
Mais je peut avoir 2 dates identique, type_achat entre donc en compte. Je dois choisir parmis 3 type_achat avec comme ordre de priorité : abo, vpc, autre

exemple avec ces données :
1 2009-08-10 abo
1 2009-08-12 vpc
1 2009-08-12 abo
1 2009-08-12 autre
Ceci ne devra me renvoyer une ligne :
1 2009-08-12 abo
Y a t'il dans mysql une fonction d'agration sur une priorité dans une liste de valeur ?

Ou bien une logique tout autre pour arriver au meme résultat ?


Merci

Posté : 31 mars 2009, 08:18
par furiouslol
Salut,

La solution serait bien dans les ORDER BY mais si tu as des strings dans ton champ ce n'est surement pas ordonnable

Posté : 31 mars 2009, 08:20
par furiouslol
Enfin si c'est ordonnable mais de façon alphabétique, ce qui n'est pas ce que tu veux ... Si tu veux faire des requêtes par rapport a un ordre il faut que cet ordre soit présent quelque part dans ta base ... Si ce n'est pas le cas, traite le en php :)

Posté : 31 mars 2009, 09:37
par pierreC
je pense avoir trouvé une solution je vais créer une table des priorités pour type_achat
autre 10
vpc 20
abo 30
avec une jointure et un max sur type_achat sa devrait le faire.

Posté : 31 mars 2009, 10:21
par furiouslol
Exact :wink:

Posté : 24 avr. 2009, 15:29
par pierreC
Hello,

je fait remonter ce messages car après qqjours de prod je viens de me rendre compte d'un pb

en effet j'ai comme donée de départ une table tmp_pierre
com_type cl_id

abo 1
mix 1
vpc 1
abo 2
mix 2
vpc 3
mix 3
vpc 4
abo 4
vpc 5
selon une table dico_priorite_com_type qui contient :
com_type priorite
mix 10
abo 20
vpc 30
ce qui doit me donner comme résultat : (regroupement sur cl_id avec selection de la plus petite priorité)
com_type cl_id

mix 1
mix 2
mix 3
abo 4
vpc 5


J'ai donc écrit cette requete :
SELECT cl_id,min(priorite) as num_type,tmp_pierre.com_type FROM tmp_pierre LEFT JOIN dico_priorite_com_type ON dico_priorite_com_type.com_type=tmp_pierre.com_type GROUP BY cl_id;
Ce qui me donne ce mauvais résultat :
+-------+----------+----------+
| cl_id | num_type | com_type |
+-------+----------+----------+
| 1 | 10 | abo |
| 2 | 10 | abo |
| 3 | 10 | vpc |
| 4 | 20 | vpc |
| 5 | 30 | vpc |
+-------+----------+----------+
les champs cl_id et num_type sont, pas contre je ne sais pas d'où est ce qu'il me sort le com_type ?


des idées ?


Merci

Posté : 24 avr. 2009, 16:09
par GiorgioLino
Suggestion : Tu demandes le champ 'com_type' dans la table tmp_pierre alors qu' a priori ce serait plutôt 'type'.

Code : Tout sélectionner

SELECT cl_id,min(priorite) as num_type, tmp_pierre.com_type <- ICI FROM tmp_pierre LEFT JOIN dico_priorite_com_type ON dico_priorite_com_type.com_type= tmp_pierre.com_type <-- ICI AUSSI GROUP BY cl_id;


Je penses que l'erreur vient de là.

Posté : 24 avr. 2009, 18:42
par pierreC
arff j'ai pourtant fait attention en extrayant un bout de mon projet vers le forum, mais je suis passé à coté de cette erreur.

J'ai modifié donc dans l'énoncé type devient com_type,

Et le problème est le même et la question subsite donc encore ...

Posté : 26 avr. 2009, 11:34
par furiouslol
Salut

Je pense que ton MIN(priorite), et ton tmp_pierre.com_type. je veux dire rien ne t'assure de récupérer le tmp_pierre.com_type en rapport avec ton MIN(priorite).

Y a eu un post ou on a parlé de ca mais je ne me souviens plus de la solution :oops:

Posté : 26 avr. 2009, 11:43
par furiouslol
Ha !! trouvé !!

http://www.phpfrance.com/forums/voir_su ... te-max.php

Donc l'utilisation du MAX dans un HAVING comme cet exemple devrait te convenir