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 :

Mettre 2 enregistrement (d'une même table) en 1 seul


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Etudiante en BTS Informatique de Gestion
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en BTS Informatique de Gestion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Mettre 2 enregistrement (d'une même table) en 1 seul
    Bonjour à tous,

    Vous allez peut-être me dire que c'est très simple et évident, enfin je n'en sais rien, mais étant bloquée dessus depuis hier matin, je me décide enfin à poster sur le forum car je n'ai pas trouvé de réponse à ma question. Je n'ai plus beaucoup de temps, je suis en stage jusqu'à vendredi soir, après je ne pourrais plus modifier l'application et je reprend les cours dès lundi...

    Alors voilà :
    Dans ma table "prise", j'ai par exemple les 2 enregistrements suivants :

    Nom_user | num_tel | num_ordi
    Pierre Dupond | NULL | A0001
    Pierre Dupond | 0243531234 | NULL
    Antoine Martin | 0243535678 | B1234
    ... | ... | ...

    Dans cette table 'prise', il y a d'autres champs mais je n'en ai pas besoin pour l'affichage que je dois avoir dans ma page.

    Je souhaiterais transformer les 2 enregistrements concernant 'Pierre Dupond' en un seul pour que cela devienne :
    Nom_user | num_tel | num_ordi
    Pierre Dupond | 0243531234 | A0001
    Antoine Martin | 0243535678 | B1234
    ... | ... | ...

    Auriez-vous une réponse à ma recherche, svp ? Je ne sais pas si ma demande est claire ou s'il faut plus d'informations, à vrai dire, c'est la première fois que je demande de l'aide en informatique sur un forum (quel qu'il soit)...

    Merci de m'avoir lu et de m'aider si vous avez une solution

  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
    Comme il peut, dans l'aboslu, y avoir plusieurs utilisateurs portant le même nom, as-tu d'autres colonnes qui permettent de distinguer les Nom_user en double mais qui sont bel et bien deux personnes différentes ?

    Normalement, tu devrais pouvoir enchaîner les requêtes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE prise p1
    INNER JOIN prise p2 ON p2.Nom_user = p1.Nom_user
    SET p1.num_tel = p2.num_tel
    WHERE p1.num_tel IS NULL
        AND p2.num_tel IS NOT NULL;
     
    UPDATE prise p1
    INNER JOIN prise p2 ON p2.Nom_user = p1.Nom_user
    SET p1.num_ordi = p2.num_ordi
    WHERE p1.num_ordi IS NULL
        AND p2.num_ordi IS NOT NULL;
    Mais je crois que MySQL n'accepte pas de modifier une table qui est utilisée dans la condition de restriction sur les données à modifier par auto-jointure.

    Il te faudrait alors passer par des tables temporaires :
    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
    CREATE TEMPORARY TABLE t1
    SELECT Nom_user, num_tel
    FROM prise
    WHERE num_tel IS NOT NULL;
     
    UPDATE prise p1
    INNER JOIN t1 ON t1.Nom_user = p1.Nom_user
    SET p1.num_tel = t1.num_tel
    WHERE p1.num_tel IS NULL;
     
    CREATE TEMPORARY TABLE t2
    SELECT Nom_user, num_ordi
    FROM prise
    WHERE num_ordi IS NOT NULL;
     
    UPDATE prise p1
    INNER JOIN t2 ON t2.Nom_user = p1.Nom_user
    SET p1.num_ordi = t2.num_ordi
    WHERE p1.num_ordi IS NULL;
    Tu vas alors avoir des doublons sur le triplet de colonnes [Nom_user, num_tel, num_ordi} dans la table qu'il faudra ensuite je pense supprimer. Si tu as une colonne identifiant de manière unique chaque ligne de la table (clé primaire auto-incrémentée), c'est relativement facile. Si tu n'en as pas, il va falloir chercher les colonnes qui permettront de décider quelle ligne en double supprimer (une colonne de date par exemple) ou bien créer artificiellement une colonne d'ordre, quitte à la supprimer ensuite.
    Bref, si tu as besoin ensuite de supprimer les doublons, il faut nous détailler un peu plus la structure de la table. Par exemple en nous donnant le résultat complet de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE TABLE prise
    Si c'est juste pour de l'affichage et que les doublons dans la table ne te gênent pas, alors fais un SELECT DISTINCT
    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
    Futur Membre du Club
    Femme Profil pro
    Etudiante en BTS Informatique de Gestion
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en BTS Informatique de Gestion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup CinePhil pour ton aide.

    Voici le résultat de la requete "SHOW CREATE TABLE priseinsert", je n'ai rien modifié mis à part les retour à la ligne :

    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
    CREATE TABLE `priseinsert` (
    \n  `Num_prise` varchar(5) NOT NULL,
    \n  `index1` varchar(1) NOT NULL,
    \n  `dispositif` varchar(10) NOT NULL,
    \n  `T_0` varchar(1) NOT NULL,
    \n  `Libre_occupe_1` varchar(10) NOT NULL,
    \n  `num_tel` varchar(4) NOT NULL,
    \n  `index2` varchar(1) NOT NULL,
    \n  `R_0` varchar(1) NOT NULL,
    \n  `Libre_occupe_2` varchar(10) NOT NULL,
    \n  `num_micro` varchar(5) NOT NULL,
    \n  `bureau` varchar(3) NOT NULL,
    \n  `agent` varchar(30) NOT NULL,
    \n  PRIMARY KEY  (`Num_prise`,`index1`)
    \n) ENGINE=MyISAM DEFAULT CHARSET=latin1
    Le num_prise est du style : BA01a, BA01b, BA02a, 114/1, 114/2, 115/1, etc... et n'est donc pas incrémenté.
    Les index1 et index2 correspondent à l'insert dans lequel est branché le téléphone ou le micro. (index1<>index2)
    Le dispositif indique simplement s'il y a un hub (ou switch, etc) ou pas.
    Les T_0 et R_0 indiquent si l'insert est pour T (téléphone) ou R (réseau : micro), le 0 indique que la place est libre (ni T ni R n'est donc prévu, on y met ce que l'on veut).
    Libre_occupe 1 et 2 indique comme leur nom l'exprime si la place est libre ou occupée par un micro ou un téléphone.
    Le num_tel est bien sur le numéro de téléphone et num_micro, le numéro du micro connecté dans l'insert.
    Le bureau indique le numéro de bureau dans lequel il se trouve.
    L'agent (=nom_user) indique l'utilisateur du téléphone et du micro.

    A noté que le téléphone peut être sur une prise et le micro sur une autre et qu'un utilisateur peut avoir soit le téléphone (cas rare mais existant), soit le micro, soit les 2.
    ex :
    Num_prise | index1 | dispositif | T_0 | Libre_occupe_1 | num_tel | index2 | R_0 | Libre_occupe_2 | num_micro | bureau | agent
    114/1 | a | hub | T | occupe | 0243530573 | b | R | occupe | GM119 | 114 | Patricia Durand
    114/1 | c | hub | T | occupe | 0243535046 | d |R |occupe | GM569 | 114 | Caroline Dupont
    115/1 | a | | T | occupe |0243530276 | b | R | occupe | GM775 | 115 | Solange Martin
    BH03a | a | | 0 | libre | NULL | b | R | occupe| B2843 | 301 | Pierre Dupond
    BH04a | a | | T | occupe |0243531234 | b | 0 |libre | NULL | 301 | Pierre Dupond
    BB05a | a | | 0 | libre | | b | 0 | libre | | 358 |
    . . . |. . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . . | . . .


    Je ne peux donc pas modifier directement dans ma table 'priseinsert' car elle reprend tout le plan de l'entreprise bureau par bureau et prise par prise.

    Il faut donc que je crée une autre table (ex: prise) pour y mettre uniquement les informations nécessaires pour mon affichage du micro et du téléphone en fonction de l'utilisateur, c'est bien ça ? Pour se faire, je copie la table priseinsert dans prise et je fais la modification comme celle que tu as fais dans ton 2ème exemple ?

    Merci de ton aide

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Etudiante en BTS Informatique de Gestion
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en BTS Informatique de Gestion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    J'ai créé une nouvelle table 'priseinsert_simplifie', simplifiée car j'ai enlevé quelques champs. Mais d'ailleurs je pourrais encore enlever Num_prise, index1 et index2...

    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
    CREATE TABLE `priseinsert_simplifie` (
    `Num_prise` varchar(5) NOT NULL,
    `index1` varchar(1) NOT NULL,
    `num_tel` varchar(4) NOT NULL,
    `index2` varchar(1) NOT NULL,
    `num_micro` varchar(5) NOT NULL,
    `dispositif` varchar(10) NOT NULL,
    `bureau` varchar(3) NOT NULL,
    `agent` varchar(30) NOT NULL,
    PRIMARY KEY  (`Num_prise`,`index1`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    Insert into priseinsert_simplifie
    Select num_prise, index1, num_tel, index2, num_micro, dispositif, bureau, agent
    from priseinsert;
    J'ai ensuite fait la requete suivante mais il y a aucun enregistrement affecté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE priseinsert_simplifie p1 
    JOIN priseinsert p2 ON p2.agent=p1.agent 
    SET p1.num_tel=p2.num_tel 
    WHERE p1.num_tel IS NULL  
    AND p2.num_tel IS NOT NULL
     
    UPDATE priseinsert_simplifie p1 
    INNER JOIN priseinsert p2 ON p2.agent=p1.agent  
    SET p1.num_micro=p2.num_micro 
    WHERE p1.num_micro IS NULL  
    AND p2.num_micro IS NOT NULL
    J'ai l'impression que pus j'avance, moins ça fonctionne...
    Je vais continuer à chercher une solution, en espèrant finir par la trouver

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Etudiante en BTS Informatique de Gestion
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante en BTS Informatique de Gestion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Un ami m'a trouvé la solution pour afficher toutes les informations sur une seule ligne par utilisateur.

    Peut-être que d'autres personnes auront le même problème que moi alors voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     SELECT *
    FROM (
     
    SELECT DISTINCT agent, num_tel
    FROM priseinsert
    WHERE num_tel IS NOT NULL
    )telephone
    NATURAL JOIN (
     
    SELECT DISTINCT agent, num_micro
    FROM priseinsert
    WHERE num_micro IS NOT NULL
    )ordi
    Merci à Pierre L. pour son aide ainsi qu'à CinePhil.

    Je signale le post résolu...

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

Discussions similaires

  1. Copier un enregistrement dans une même table
    Par slammer dans le forum Langage SQL
    Réponses: 11
    Dernier message: 04/05/2010, 23h17
  2. Comparaison d'enregistrements d'une même table
    Par valtau dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/05/2008, 15h06
  3. Différence entre 1 même champ sur 2 enregistrements d'une même table
    Par manulemalin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/02/2008, 09h47
  4. mysql: relier deux enregistrement d'une même table
    Par __antoine__ dans le forum Administration
    Réponses: 2
    Dernier message: 14/06/2007, 23h14
  5. Réponses: 1
    Dernier message: 08/09/2006, 15h56

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