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 :

Regrouper des lignes comportant des informations différentes


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Par défaut Regrouper des lignes comportant des informations différentes
    /* Bonjour */

    J'ai une table contenant 4 colonnes et environ 1 000 000 lignes.
    Certaines de ces lignes sont enregistrées 2 fois mais chacune avec des infos que l'autre n'a pas.
    EX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    | id|  |id_nom|  | nom|  |email       |
    |  1|  |   552|  |paul|  |            |
    |  2|  |  4298|  |    |  |jean@jean.fr|
    ....
    |203|  |   552|  |    |  |paul@paul.fr|
    ....
    |352|  |  4298|  |jean|  |            |
    Je souhaiterai donc rassembler les informations en une seule ligne et supprimer celle n’étant pas complète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | id|  |id_nom|  | nom|  |email       |
    |  1|  |   552|  |paul|  |paul@paul.fr|
    |  2|  |  4298|  |jean|  |jean@jean.fr|
    .
    C'est faisable?

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    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 900
    Par défaut
    Salut Jimmo.

    J'ai fait cela en trois phases :

    1) je traite le prénom.
    2) je traite l'email.
    3) je supprime les doublons en conservant que celle ayant le id le plus petit.

    voici l'exemple :
    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
    --------------
    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,
      `id_nom`   integer unsigned not null,
      `nom`      varchar(255)     not null,
      `email`    varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `test` (`id`,`id_nom`,`nom`,`email`) values
      (  1,  552, 'paul',  ''),
      (  2, 4298, '',      'jean@jean.fr'),
      (203,  552, '',      'paul@paul.fr'),
      (352, 4298, 'jean',  '')
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----+--------+------+--------------+
    | id  | id_nom | nom  | email        |
    +-----+--------+------+--------------+
    |   1 |    552 | paul |              |
    |   2 |   4298 |      | jean@jean.fr |
    | 203 |    552 |      | paul@paul.fr |
    | 352 |   4298 | jean |              |
    +-----+--------+------+--------------+
    --------------
    update     `test` as t1
    inner join `test` as t2
    on t2.id_nom = t1.id_nom
    set t1.nom = t2.nom
    where t1.nom  = ''
      and t2.nom != ''
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----+--------+------+--------------+
    | id  | id_nom | nom  | email        |
    +-----+--------+------+--------------+
    |   1 |    552 | paul |              |
    |   2 |   4298 | jean | jean@jean.fr |
    | 203 |    552 | paul | paul@paul.fr |
    | 352 |   4298 | jean |              |
    +-----+--------+------+--------------+
    --------------
    update     `test` as t1
    inner join `test` as t2
    on t2.id_nom = t1.id_nom
    set t1.email = t2.email
    where t1.email  = ''
      and t2.email != ''
    --------------
     
    --------------
    select * from test
    --------------
     
    +-----+--------+------+--------------+
    | id  | id_nom | nom  | email        |
    +-----+--------+------+--------------+
    |   1 |    552 | paul | paul@paul.fr |
    |   2 |   4298 | jean | jean@jean.fr |
    | 203 |    552 | paul | paul@paul.fr |
    | 352 |   4298 | jean | jean@jean.fr |
    +-----+--------+------+--------------+
    --------------
    delete from `test`
    where id not in (select id from (select min(id) as id from test group by id_nom) as x)
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+--------+------+--------------+
    | id | id_nom | nom  | email        |
    +----+--------+------+--------------+
    |  1 |    552 | paul | paul@paul.fr |
    |  2 |   4298 | jean | jean@jean.fr |
    +----+--------+------+--------------+
    --------------
    commit
    --------------
     
    --------------
    set autocommit = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Il y a peut-être une solution plus performante, mais je crois que ceci est du jetable, donc inutile de faire quelque chose de sophistiqué.


    @+

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Si tu as au plus deux lignes par id_nom, cette requête te permet de regrouper simplement les informations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  MIN(id)
        ,   id_nom
        ,   MAX(nom)
        ,   MAX(email)
    FROM    matable
    GROUP BY id_nom
    ;
    Je te laisse réfléchir aux deux requêtes à créer pour faire d'abord la mise à jour puis supprimer les lignes superflues.

    [edit : grilled ]
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 124
    Par défaut
    Salut Artemus24, c'est exactement ce qu'il me fallait.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/11/2015, 12h25
  2. [XL-2010] Supprimer des lignes comportant des éléments vides
    Par Gorillo dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 17/07/2015, 10h08
  3. Réponses: 1
    Dernier message: 23/05/2008, 10h10
  4. Réponses: 8
    Dernier message: 29/04/2008, 13h58
  5. Traitement des lignes [suppression des lignes vides]
    Par turbo_chess dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2007, 09h16

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