IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Dédoublonnage un peu particulier


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut Dédoublonnage un peu particulier
    Bonsoir,

    j'ai une table de clients (table_client):

    ID_CLIENT NOM
    22 Jean
    23 Louis
    24 Bernard
    ... ...

    qui est reliée à une autre table avec une réfence par client (table_ref):

    ID REF ID_CLIENT
    33 a1123 22
    34 a0001 22
    31 a1123 23
    30 a0003 26
    40 a11ee 25
    66 a0001 24
    90 a1123 24

    Sachant que chaque client peut avoir plusieurs references, j'arrive à regrouper mes clients par reference ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    tr.ID,                   
    tr.REF, 
    COUNT(DISTINCT tr.ID_CLIENT)
     
    FROM table_client AS tr
     
    GROUP BY tr.REF
     
    HAVING COUNT(DISTINCT tr.ID_CLIENT)>1;

    Ce qui me retourne la liste :

    ID REF COUNT
    33 a1123 3
    34 a0001 2


    Car cela coincide avec les élements :

    ID | REF | COUNT
    -------------------------------
    33 | a1123 | 3
    //----33 | a1123 | 22
    //----31 | a1123 | 23
    //----90 | a1123 | 24

    34 | a0001 | 2
    //----34 | a0001 | 22
    //----66 | a0001 | 24

    Ok ! Mais comme on peut le voir le ID_CLIENT 22 remonte dans les 2 regroupements !

    Comment faire pour recuperer les regrouprements par REF dont les ID_CLIENT n'ont pas encore étaient remontés ?

    Afin d'obtenir cette liste :

    ID | REF | COUNT
    -------------------------------
    33 | a1123 | 3
    //----33 | a1123 | 22
    //----31 | a1123 | 23
    //----90 | a1123 | 24

    // Ignoré car ID_CLIENT 22, 24 sont déjà dans le regroupement de REF 'a1123'
    //34 | a0001 | 2
    //----34 | a0001 | 22
    //----66 | a0001 | 24

    Merci de votre aide,

    FlashPapa

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    Par défaut
    Bonjour,

    Votre requête est faisable, mais si vous la lancez plusieurs fois sur les mêmes données, vous n'obtiendrez pas toujours le même résultat. Est-ce un problème sans importance vis-à-vis de votre besoin final ?

    A priori vos 2 tables reposent sur une relation "plusieurs à plusieurs" au niveau de la modélisation des données. Si vous ètes bien dans ce cas, il serait judicieux de créer une table associative. Cette solution vous permettra en outre de créer la requête sql dont vous avez besoin de façon fort simple.

    Merci de fournir une description de vos tables avec les clés primaires et étangères ainsi que les contraintes d'unicités afin de mieux comprendre le cas qui vous occupe.
    La colonne REF ne semble pas soumise à une contrainte d'unicité, et cela me parait étonnant a priori.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Il faudrait en effet préciser le besoin pour apporter une réponse adaptée. Dans votre exemple, pourquoi est-ce à la REF a0001 "d'ignorerr" les clients 22 et 24 car il sont dans la REF 'a1123', et non pas à la REF 'a1123' des les ignorer car ils sont dans la REF a0001 ?

    Si vous voulez vous appuyer sur leur "première apparition" selon l'ordre de la colonne ID, vous pouvez faire quelque chose comme ceci (à tester) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT
    	L.REF
    	,COUNT(*)	
    FROM (
    	SELECT 
    		MIN(ID) AS MinID
    		,ID_CLIENT
    	FROM LaTable
    	GROUP BY ID_CLIENT
    ) AS T
    INNER JOIN LaTable L
    	ON L.ID = T.MinID
    GROUP BY L.REF

Discussions similaires

  1. [XSLT]Tableau un peu particulier
    Par JohnBlatt dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/06/2006, 18h14
  2. Un tri un peu particulier
    Par GregPeck dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/06/2006, 15h32
  3. Menu un peu particulier avec des onmouseover
    Par Jinroh77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 14h30
  4. #define un peu particulier
    Par greuh dans le forum C
    Réponses: 14
    Dernier message: 12/10/2005, 16h42
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo