Page 1 sur 1

Mysql-Requête groupement selon critère

Posté : 01 janv. 2014, 03:04
par maestro1303
Je vais exposer le problème (hélas) que je rencontre depuis un moment avec une table(5 champs A,B,C, D,E et F(b est une clé)) sous MySQL en donnant un extrait des données de cette table:

Code : Tout sélectionner

SAR-T 270 102 05 07 X3 SAR-T 271 102 05 07 X3 SAR-T 272 102 05 07 X3 SAR-T 273 102 05 07 X3 SAR-T 274 102 05 07 X3 SAR-T 275 102 05 07 X3 SAR-T 276 102 05 07 X3 SAR-T 277 102 05 07 X3 SAR-T 278 102 05 07 X3 SAR-T 279 102 05 07 X3 SAR-T 7701 102 05 07 X3 SAR-T 7702 102 05 07 X3 SAR-T 7703 102 05 07 X3 SAR-T 7704 102 05 07 X3 SAR-T 7706 102 05 07 X3 SAR-T 7707 102 05 07 X3 SAR-T 7709 102 05 07 X3 SAR-T 7710 102 05 07 X3 SAR-T 7712 102 05 07 X3 SAR-T 7713 102 05 07 X3 SAR-T 7714 102 05 07 X3 SAR-T 7715 102 05 07 X3 SAR-T 7716 102 05 07 X3 SAR-T 7717 102 05 07 X3 SAR-T 7718 102 05 07 X3 SAR-T 7719 102 05 07 X3 SAR-T 7720 102 05 07 X3 SAR-T 7721 102 05 07 X3 SAR-T 7722 102 05 07 X3 SAR-T 7723 102 05 07 X3 SAR-T 7724 102 05 07 X3 SAR-T 7725 102 05 07 X3 GAR-Z 7726 052 035 076 X3 SAR-T 7727 102 05 07 X3 SAR-T 7728 102 05 07 X3 SAR-T 7729 102 05 07 X3 SAR-T 7740 102 05 07 X3 SAR-T 7739 102 05 07 X3
Voici ce que je veux avoir en résumé:

de la ligne 1 à la ligne 10, on supprime tout en remplaçant par

Code : Tout sélectionner

SAR-T 27 102 05 07 X3
En d'autres termes 27 représente les 10 enregistrements (de 270 à 279) et toutes les infos dans les 10 enregistrements sont identiques à part bien sûr la clé qui est différente forcément donc on fait un agrégat en quelque sorte et on rédume tout dans l'enregistrement ci dessus qui a 27 comme clé(bien évidemment cette valeur nouvelle est différente de toutes les autres valeurs existantes déjà dans le champs B sinon il y aurait une erreur)

de la ligne 11 à la ligne 17

Code : Tout sélectionner

SAR-T 770 102 05 07 X3
malgré le fait que la lignes correspondant aux deux IDs 7705 et 7708 n'existent pas dans la liste.


de la ligne 18 à 26, on supprime tout pour remplacer par la ligne

Code : Tout sélectionner

SAR-T 771 102 05 07 X3
de la ligne 27 à 37 on garde tout tel quel car malgré la sériation parfaite de l'ID, on a des valeurs différentes des champs C, D et E à la ligne 33, donc on ne peut pas grouper.


Merci infiniment d'avoir la patience de me lire car je trouve tout ça ennuyeux malgré le fait que ce soit mon premier souci pour le moment.

Merci infiniment de votre aide.

Re: Mysql-Requête groupement selon critère

Posté : 02 janv. 2014, 00:18
par moogli
salut,

désolé mais c'est pas clair ton truc.

si l'on omet la clef primaire tu n'as que deux lignes différentes
SAR-T xxxx 102 05 07 X3
GAR-Z xxxx 052 035 076 X3

tu ne peux trier que selon une donnée dont tu sera sur.
or la il n'y a que la la clef primaire qui te permet de faire quelque chose.

Si tu souhaite dédoublonner la table pour ne garder que les deux lignes ci dessus un simple select avec un group by te retournera les lignes dont tu as besoin. (select a, c, d,e from latable group by a,c,d,e).
ensuite tu garde les données des lignes ainsi récupérées, delete de la table puis ré insertion.

si tu as d'autre discriminant alors il est peux être possible de t'aider mieux.

sinon tu doit connaitre les valeurs de pk pour réaliser ton opération.


@+

Re: Mysql-Requête groupement selon critère

Posté : 02 janv. 2014, 01:01
par maestro1303
Merci beaucoup Moogli de cette réponse rapide ,
Justement le but est de virer toutes lignes qui se ressemblent sauf par le champ B(la clé).

Comme vous l'avez bien compris les ligne seront regroupées(il faut un group by FLOOR(ID/10) ).
Je vais essayer d'expliquer le problème en plus simple

Ce regroupement ne concerne que les enregistrements qui:
• sont identiques par tous leurs champs sauf le clé en B(qui est une valeur entière)
• ont leur champ clé qui appartient à une sériation existante dans dans d'autres enregistrements(exple :248, dans une série 242,243,244,246,247,249 et qui en plus partagent tous les autres champs en toute rigueur! on aura alors un seul enregistrement ayant pour ID=24 et qui va remplacer les 7 autres qui sont supprimés).

Cas limite je donne un exemple si on a les 5 enregistrements qui suivent :

Code : Tout sélectionner

Zarbi 235 192 05 07 R3 Zarbi 236 192 05 07 R9 Zarbi 237 196 16 07 R3 Zarbi 238 192 05 07 R3 Darbi 239 192 05 07 R3

Les 2 enregistrements
Zarbi 235 192 05 07 R3 et Zarbi 238 192 05 07 R3 seront regroupés en Zarbi 23 192 05 07 R3
les 3 autres seront laissés tels qu'ils sont
Zarbi 236 192 05 07 R9
Zarbi 237 196 16 07 R3
Darbi 239 192 05 07 R3
Car non regroupables

donc au final on aurait

Code : Tout sélectionner

Zarbi 23 192 05 07 R3 Zarbi 236 192 05 07 R9 Zarbi 237 196 16 07 R3 Darbi 239 192 05 07 R3
Le regroupement se fait à cette condition et l'ID de l'enregistrement représentant sera la partie entière de la division de l'ID d'origine par 10
Ah j'allais oublier de te dire que l'unicité du nouvel ID ainsi crée est garantie donc aucun risque de conflit de clé possible!
Merci d'avance.

Re: Mysql-Requête groupement selon critère

Posté : 02 janv. 2014, 14:02
par Mazarini
Peut être :
select a, b, c, d, e
from latable
grup by a, FLOOR(b/10), c, d, e

Re: Mysql-Requête groupement selon critère

Posté : 04 janv. 2014, 00:13
par moogli
hum b n'est pas dans le group by il y a des chance que ce la pose problème.

je vois la solution comme ça :
- création d'une table temporaire (heap) contenant id, a,c,d et e
- le select qui va bien. test les différents exemple de requête la solution doit être par la. Même si sans la structure de la table (ni jeux de données de test) on ne peux pas vraiment tester ;)
- insertion dans la table temporaire des données du select
- delete de la table d'origine
- copie de la table temporaire vers la table d'origine (insert into latable (pk,a,c,d,e) values ( select * from tabletemporaire) (à tester).


@+