Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/03/2011, 11h00   #1
Invité de passage
 
Femme Delphine
Etudiante en BTS Informatique de Gestion
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Delphine

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

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 4
Points : 4
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
prissou53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 12h11   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
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 :
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 :
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/03/2011, 14h19   #3
Invité de passage
 
Femme Delphine
Etudiante en BTS Informatique de Gestion
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Delphine

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

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 4
Points : 4
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 :
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
prissou53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 16h36   #4
Invité de passage
 
Femme Delphine
Etudiante en BTS Informatique de Gestion
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Delphine

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

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 4
Points : 4
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 :
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 :
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
prissou53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 10h54   #5
Invité de passage
 
Femme Delphine
Etudiante en BTS Informatique de Gestion
Inscription : janvier 2010
Messages : 6
Détails du profil
Informations personnelles :
Nom : Femme Delphine

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

Informations forums :
Inscription : janvier 2010
Messages : 6
Points : 4
Points : 4
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 :
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...
prissou53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h33.


 
 
 
 
Partenaires

Hébergement Web