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 :

Requête pour supprimer des doublons


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Requête pour supprimer des doublons
    Bonjour,

    Je sais qu'il existe multitude de solutions sur le web pour supprimer en mysql des doublons, mais là je n'y arrive pas.

    J'ai une table qui s'appelle "company" et qui contient :
    company_name
    company_logo
    company_profile
    industry
    employees
    headquarter
    website
    competitors

    Parfois, je toruve cela (Carrefour est un exemple) :

    Carrefour
    logo.jpg
    http://jlkajalkj
    Supermarket
    10 000
    Paris
    carrefour.com
    Auchan

    +

    Carrefour
    -
    -
    -
    -
    -
    -


    Je voudrai arriver à supprimer le second carrefour, car il m'est inutile, car comporte le moins de données.

    Auriez-vous une idée de comment faire ?

    Merci d'avance

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je voudrai arriver à supprimer le second carrefour, car il m'est inutile, car comporte le moins de données.
    Ne faudrait-il pas d'abord vérifier s'il n'y a pas des données à rassembler entre deux lignes ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT c1.company_name, c1.company_logo, c1.company_profile, c1.industry, c1.employees, c1.headquarter, c1.website, c1.competitors
    FROM company c1
    INNER JOIN 
    (
    	SELECT company_name
    	FROM company 
    	GROUP BY company_name
    	HAVING COUNT(*) > 1
    ) tmp ON tmp.company_name = c1.company_name
    ORDER BY c1.company_name
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    La problématique est de fusionner les lignes identiques afin de compléter les colonnes qui ne sont pas renseignées.
    Ensuite, on supprime les doublons. Pour résoudre ce problème, je passe par une table temporaire. Voici ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`    INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `clef`  VARCHAR(255)     NOT NULL,
      `col1`  VARCHAR(255)         NULL,
      `col2`  VARCHAR(255)         NULL,
      `col3`  VARCHAR(255)         NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`clef`,`col1`,`col2`,`col3`) values
      ('alpha', null,          null,   'rouge'),
      ('beta',  null,         'vert',  null),
      ('gamma', null,         'bleu',  null),
      ('alpha', 'orange',     null,    null),
      ('beta',  'gris',       null,    null),
      ('gamma', null,         null,    'violet'),
      ('alpha', null,         'jaune', null),
      ('beta',  null,         null,   'magenta'),
      ('gamma', 'turquoise',  null,    null)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-------+-----------+-------+---------+
    | id | clef  | col1      | col2  | col3    |
    +----+-------+-----------+-------+---------+
    |  1 | alpha | NULL      | NULL  | rouge   |
    |  2 | beta  | NULL      | vert  | NULL    |
    |  3 | gamma | NULL      | bleu  | NULL    |
    |  4 | alpha | orange    | NULL  | NULL    |
    |  5 | beta  | gris      | NULL  | NULL    |
    |  6 | gamma | NULL      | NULL  | violet  |
    |  7 | alpha | NULL      | jaune | NULL    |
    |  8 | beta  | NULL      | NULL  | magenta |
    |  9 | gamma | turquoise | NULL  | NULL    |
    +----+-------+-----------+-------+---------+
    --------------
    create temporary table `temp` as
      select    clef,
                max(col1) as col1,
                max(col2) as col2,
                max(col3) as col3
          from  test
      group by  clef
    --------------
     
    --------------
    select * from `temp`
    --------------
     
    +-------+-----------+-------+---------+
    | clef  | col1      | col2  | col3    |
    +-------+-----------+-------+---------+
    | alpha | orange    | jaune | rouge   |
    | beta  | gris      | vert  | magenta |
    | gamma | turquoise | bleu  | violet  |
    +-------+-----------+-------+---------+
    --------------
    delete t1 from test as t1
        inner join test as t2
     on  t1.clef = t2.clef
    and  t1.id   > t2.id
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-------+------+------+-------+
    | id | clef  | col1 | col2 | col3  |
    +----+-------+------+------+-------+
    |  1 | alpha | NULL | NULL | rouge |
    |  2 | beta  | NULL | vert | NULL  |
    |  3 | gamma | NULL | bleu | NULL  |
    +----+-------+------+------+-------+
    --------------
    update      `test` as t1
    inner join  `temp` as t2
            on  t1.clef = t2.clef
           set  t1.col1 = t2.col1,
                t1.col2 = t2.col2,
                t1.col3 = t2.col3
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+-------+-----------+-------+---------+
    | id | clef  | col1      | col2  | col3    |
    +----+-------+-----------+-------+---------+
    |  1 | alpha | orange    | jaune | rouge   |
    |  2 | beta  | gris      | vert  | magenta |
    |  3 | gamma | turquoise | bleu  | violet  |
    +----+-------+-----------+-------+---------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci de votre aide. L'idée de regrouper/fusionner est très bonne, mais comment faire pour faire la distinction entre une case avec logo.jpg et un "-" ?

    CinePhil ? Ta requete fait quoi exactement ? Elle fusionne les 2 ? Ou seulement il supprime les doublons ?

    Carrefour
    logo.jpg
    http://jlkajalkj
    Supermarket
    10 000
    Paris
    carrefour.com
    Auchan

    +

    Carrefour
    - (Ce sont des tirets - les cellules ne sont pas vides)
    -
    -
    -
    -
    -

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ma requête ne faisait que visualiser les données des company_name en double.
    J'ai supposé que, pour un même company_name, par exemple présent deux fois, il pouvait y avoir des données :
    - présentes dans les deux lignes ;
    - présentes sur la première ligne et pas la seconde ;
    - présentes sur la seconde ligne et pas la première ;
    - différentes entre les deux lignes.

    Dans ces cas là, garder une ligne et supprimer l'autre entraîne une perte de données qui ont bien dû être enregistrées pour une bonne raison.

    Mais si tu n'as que le type de cas que tu as donné, c'est à dire une ligne remplie et l'autre non, alors il est assez simple de supprimer la ligne vide et de conserver la remplie.
    À toi de nous préciser ton besoin.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    L'absence de valeur pour une colonne ne doit pas être une valeur, comme dans votre exemple où vous utilisez le tiret. Pourquoi ?
    Car cela va occuper de la place mémoire pour rien mais il existe le NULL qui joue déjà ce rôle, alors autant l'utiliser, non ?

    L'astuce que j'ai utiliser est la confrontation entre NULL et une valeur en utilisant la fonction max().
    Quelque soit la valeur, elle sera toujours supérieure au NULL.

    Je ne connais pas le type de votre colonne "logo.jpg", mais si c'est du varchar(), cela ne devrait pas poser de problème. Pourquoi ?
    Le caractère ASCII du tiret est en décimal 45 (2D en hexa) et est inférieur aux chiffres et aux lettres.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci encore de vos retours.

    Il faut savoir que près de 90% des enregistrements proviennent de la V1 de notre script, c'est à dire d'un fichier Excel. Et ce script de notre fichier excel insérait un "-" pour une donnée vide.

    Idéalement ce que je voudrais faire, si vous voulez bien m'aider c'est supprimer les doublons sur le champs "company_name" biensur et l'autre filtre serai de dire si le champs :

    - website contient "quelquechose/un nom de domaine" pour le 1° et si website contient un "-" sur le 2°, il faudrai garder seulement le 1°.

    Merci à vous.

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut surpriz13.

    Citation Envoyé par surpriz13
    Et ce script de notre fichier excel insérait un "-" pour une donnée vide.
    Ce qui est valable pour excel ne l'est pas pour MySql et vice-versa.
    Donc pourquoi, lors de chargement de votre fichier excel, n'avez-vous pas transformé le tiret en NULL ?

    Citation Envoyé par surpriz13
    website contient "quelque chose/un nom de domaine" pour le 1° et si website contient un "-" sur le 2°, il faudrait garder seulement le 1°.
    Vous n'êtes pas très clair avec vos 1° et vos 2°. Cela se rapporte à quoi ? Je suppose à l'exemple de votre premier message ?

    Si je comprends bien, vous avez toujours plusieurs lignes lorsque la colonne "company_name" possède une valeur comme par exemple avec la valeur "carrefour".
    Parmi toutes ces lignes, vous avez des lignes ayant un tiret pour la colonne "website" et d'autres, où vous avez le nom de votre site.
    Vous désirez supprimer les lignes ayant un tiret à la seule condition que vous ayez des lignes n'ayant pas le tiret.
    En d'autre terme, votre critère s'exprime aussi : le total de toutes vos lignes doit être supérieur au total des lignes ayant un tiret. Voici ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    --------------
    drop view if exists `vue`
    --------------
     
    --------------
    create view `vue` as
          select  t1.clef
            from  test as t1
     
      inner join  (  select    clef,
                               count(*) as nbre
                         from  test
                     group by  clef
                  ) as t2
              on  t2.clef = t1.clef
     
      inner join  (  select    clef,
                               count(*) as nbre
                         from  test
                        where  col3 is null
                     group by  clef
                  ) as t3
              on  t3.clef = t1.clef
     
           where  t2.nbre > t3.nbre
        group by  t1.clef
    --------------
     
    --------------
    select * from vue
    --------------
     
    +-------+
    | clef  |
    +-------+
    | alpha |
    | beta  |
    | gamma |
    +-------+
    --------------
    delete t1 from  test as t1
        inner join  vue  as t2
                on  t2.clef = t1.clef
             where  t1.col3 is null
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+------+------+---------+
    | id | clef  | col1 | col2 | col3    |
    +----+-------+------+------+---------+
    |  1 | alpha | NULL | NULL | rouge   |
    |  6 | gamma | NULL | NULL | violet  |
    |  8 | beta  | NULL | NULL | magenta |
    +----+-------+------+------+---------+
     
    Appuyez sur une touche pour continuer...
    C'est le même jeu d'essai que mon exemple précédent.
    La condition "where t2.nbre > t3.nbre" permet de sélectionner les lignes vérifiant votre critère.
    Cela ne résout pas le problème des doublons, mais permet de faire du ménage.

    Pour la suppression des doublons, je vous ai donné la solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    delete t1 from test as t1
        inner join test as t2
     on  t1.clef = t2.clef
    and  t1.id   > t2.id
    La colonne à tester, donc celle où vous avez des doublons, est "clef". Vous remplacez "clef" par "company_name" dans mon exemple.
    On conserve la ligne dont la colonne "id" possède la plus petite valeur.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci, je teste :-) A très vite

  10. #10
    Membre régulier Avatar de monaka
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 64
    Points : 107
    Points
    107
    Par défaut
    salut a tous, vu et je suppose qu'on ne peut enregistrer qu'une fois une ''company"

    hormis la requête, je proposerais pour celui qui utilise l'interface phpmyadmin de tout simplement ajouter la valeur unique au champ en question
    ainsi l'insertion d'un doublon ne pourra se faire.
    La rigueur vient toujours à bout de l'obstacle.
    Les détails font la perfection, et la perfection n'est pas un détail.

    J'avais une charrette tirée par des chevaux, mais j'ai acheté une voiture avec un moteur.
    Est-ce que je dois tout le temps rouler avec le moteur, ou est-ce que je peux atteler mes chevaux à la voiture de temps en temps ?

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut armand biatchon.

    Il ne s'agit pas de trouver une astuce pour résoudre le problème des doublons mais plutôt de savoir pourquoi, lors de la conception de la base de données, la solution des doublons a été envisagée.

    Il est fort probable qu'une étape soit manquante lors de la saisie, par exemple celle de vérifier l'existence d'une compagnie.
    Mais il se peut aussi qu'il s'agisse du chargement de données ayant diverses origines, qui au final, vous toutes se retrouver dans une même table.

    Je pense qu'il y a un manque du point de vue de la fonctionnelle et cela va se ressentir dans la conception de la base, mais aussi dans les traitement.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [RegEx] Expression régulière pour supprimer des doublons
    Par cbroissa dans le forum Langage
    Réponses: 5
    Dernier message: 20/05/2017, 01h59
  2. Requête pour rechercher des doublons partiels
    Par jubourbon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2011, 11h22
  3. Requête pour supprimer les doublons
    Par chouchouilloux dans le forum SQL
    Réponses: 2
    Dernier message: 11/06/2010, 11h46
  4. Réponses: 7
    Dernier message: 09/02/2009, 14h28
  5. Requête pour supprimer des doublons dans une table
    Par nomade333 dans le forum Contribuez
    Réponses: 0
    Dernier message: 30/03/2008, 12h48

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