Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 18/03/2010, 11h44   #1
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Par défaut Mise à jour d'une table à partir d'une autre table

Bonjour, je viens vers vous car je n'arrive pas à former une requête de mise à jour, je ne vois pas comment faire...

De plus mes 2 tables sont sur le même serveur, mais pas sur la même base, après je peut dupliquer ma 1ere table dans la seconde base si il y a besoin...

J'ai une table T1 dans une base BDD1 contenant entre autre champs les champs "reference" et "prix".

J'ai une table T2 dans une base BDD2 contenant entre autre les champs "reference" et "prix".

Je veux mettre à jour les prix de T2 à partir des prix de T1.
Petite subtilité, une référence de T1 peut avoir plusieurs concordances dans T2 sous la forme de "référence %%%"

Merci d'avance à tous de votre aide en espérant avoir été clair
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 12h02   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Je me lance :
Code sql :
UPDATE T2 JOIN T1 ON T2.reference=T1.reference SET T2.prix = T1.prix
(fait une sauvegarde hein )
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 14h03   #3
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Hum je vois a peu près le principe mais la ca ne prends pas en compte que mes 2 références ne soit pas exactement pareil si ?
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 14h35   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Pourquoi tes clefs ne sont pas uniformes ?

Je pense qu'on peut faire un truc totalement affreux comme :
Code :
UPDATE T2 JOIN T1 ON T2.reference='Référence ' &  T1.reference SET T2.prix = T1.prix
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 15h07   #5
Membre du Club
 
Avatar de s.lennon
 
Stéphanie Lennon
Inscription : juin 2009
Messages : 66
Détails du profil
Informations personnelles :
Nom : Stéphanie Lennon
Âge : 26

Informations forums :
Inscription : juin 2009
Messages : 66
Points : 55
Points : 55
Bonjour.

Je ne suis pas sûre, mais si tes deux tables sont sur deux BDD, un simple
Code :
 UPDATE T2 JOIN T1 ON T2.reference=T1.reference SET T2.prix = T1.prix
ne suffira pas, si ? Il va bien falloir préciser quelque part que tu travailles sur deux BDD distinctes, non ?

Tu veux le faire en une seule requête SQL ? Parce que sinon en PHP ça doit être un peu plus simple je pense.
s.lennon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 15h18   #6
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Je disais que je pouvais si besoin dupliquer T1 sur BDD2

Effectivement j'ai pensé au Php mais pour une fois j'avoue que je vois pas bien l'algorithme a suivre....
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 16h10   #7
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Deux bases distinctes ne pose aucun problème tant qu'elles sont sur le meme serveur.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 16h14   #8
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Certes mais dans ta requête tu ne spécifie pas dans quelle base trouver T1 et quelle base trouver T2 si ?
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 16h17   #9
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ca s'ecrit comme ça : base.table.colonne

Ta connexion peut se faire sur n'importe laquelle des deux bases, ou sur aucune des deux puisque tu spécifies leurs noms dans la requête.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 16h21   #10
Membre du Club
 
Avatar de s.lennon
 
Stéphanie Lennon
Inscription : juin 2009
Messages : 66
Détails du profil
Informations personnelles :
Nom : Stéphanie Lennon
Âge : 26

Informations forums :
Inscription : juin 2009
Messages : 66
Points : 55
Points : 55
Re-bonjour.

Qu'il s'agisse de PHP comme de SQL, la démarche est relativement simple si j'ai bien compris ton problème :
- récupération des données dans T1
- éventuellement formatage de ces données (pour pouvoir faire coller tes références, même si j'avoue ne pas avoir bien compris ce point-là)
- mise à jour de T2

Dupliquer T1 sur BDD2 est la solution la plus simple effectivement, mais je suppose qu'il devait y avoir une raison aux différences entre T1 et T2, donc à voir s'il faut conserver ces différences, et si tu choisis de dupliquer, voir comment garder un lien entre T1 "bis" et T2 si besoin...

Est-ce que tu pourrais donner un exemple pour cette histoire de références différentes ? Merci.
s.lennon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 16h28   #11
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Une fois mise a jour plus besoin de corélation entre les deux bases...

En fait pour les références dans T1 j'ai par exemple 1405 et dans T2 1405 B - 1405 Y erc... qui signifie la référence 1405 en noir "Black" ou jaune "Yellow" car c'est un site qui a été mis a jour et remis a jour, et re-remis a jour avant que j'arrive dans la boite...et oui je suis d'accord avec vous c'est un peu bancale
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 16h52   #12
Membre du Club
 
Avatar de s.lennon
 
Stéphanie Lennon
Inscription : juin 2009
Messages : 66
Détails du profil
Informations personnelles :
Nom : Stéphanie Lennon
Âge : 26

Informations forums :
Inscription : juin 2009
Messages : 66
Points : 55
Points : 55
Finalement, ça ne paraît pas plus compliquer en SQL qu'en PHP, autant pour moi ^^

Donc, si je comprends bien, quelle que soit la référence dans T2, tu vas mettre à jour d'après T1 ? Du coup il n'y aura plus de différences entre 1405-B, 1405-Y, etc. dans T2 après mise à jour ?

Peut-être qu'il faudrait commencer par "faire un peu de ménage" dans T2 avant de continuer histoire d'alléger la suite ?
s.lennon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 17h07   #13
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
En fait par exemple dans T1 j'ai la réf 1405 à 10€

Dans T2 je peut avoir des références du type :
1405 B
1405 Y
1405 NB
1405 XXXX
qui sont toutes par exemple a 15€

Il faut que je fasse concorder mes prix de T2 avec ceux de T1 c'est à dire mettre toutes les références du type 1405%% à 10€

il n'y a aucune référence en trop dans T2

suis-je clair ?
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 17h22   #14
Membre du Club
 
Avatar de s.lennon
 
Stéphanie Lennon
Inscription : juin 2009
Messages : 66
Détails du profil
Informations personnelles :
Nom : Stéphanie Lennon
Âge : 26

Informations forums :
Inscription : juin 2009
Messages : 66
Points : 55
Points : 55
C'est clair , moi par contre je ne l'ai peut-être pas été Je ne disais pas qu'il faut "vider" T2 (je suppose que si ces références sont stockées, c'est qu'elles sont à conserver ^^), mais qu'il fallait peut-être (et j'insiste sur le "peut-être" !) légèrement en modifier la structure pour l'adapter... Maintenant c'est toi qui connaît le projet et qui peut juger si c'est nécessaire ou non, c'était juste une suggestion

Finalement, avec la requête toute simple de Sabotage, ça paraît plutôt simple en mettant ta référence dans une close WHERE... à la condition bien sûr que toutes tes références, dans T1 comme dans T2, aient un "format" similaire (si des fois les références dans T2 sont 1405-B et d'autres fois B-1405, ça devient un peu plus compliqué )... ça donnerait quelque chose du style :
Code :
1
2
3
 UPDATE T2 SET T2.prix = 
(SELECT T1.prix FROM T1 WHERE T1.ref = 'XXX') 
WHERE T2.prix LIKE 'XXX%'
s.lennon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 17h25   #15
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Yes, elles ont toujours la même structure

La requête me parait clair mais comment je dois l'écrire pour lui dire que T1 est dans BDD1 et T2 dans BDD2 jai pas saisi ce point...

Et sinon je l'éxécute direct comme ça dans PhpMyAdmin ?

Merci de votre aide en tout cas, j'ai le cerveau qui fume un peu aujourd'hui

Et 2ème question dans la requête il y a T1.ref = 'XXX' mais moi je veux que ca me parcours totalement T1, que ca update toutes les références....

Et je devance la question non je peut pas les faire à la main, il y a plus de 3000 références que je connais pas toutes d'ailleurs oui je sais suis chiant
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 17h30   #16
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Citation:
Envoyé par sabotage Voir le message
Pourquoi tes clefs ne sont pas uniformes ?

Je pense qu'on peut faire un truc totalement affreux comme :
Code :
UPDATE T2 JOIN T1 ON T2.reference='Référence ' &  T1.reference SET T2.prix = T1.prix
Oups j'avais pas vu la remarque
Ce n'est pas moi qui ai créé les bases, je fait de la récup de code, et je sais pas pourquoi mais les références ne sont pas les clés de table...y'a un auto increment en clé
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2010, 11h44   #17
Membre du Club
 
Avatar de s.lennon
 
Stéphanie Lennon
Inscription : juin 2009
Messages : 66
Détails du profil
Informations personnelles :
Nom : Stéphanie Lennon
Âge : 26

Informations forums :
Inscription : juin 2009
Messages : 66
Points : 55
Points : 55
Bonjour.

Tu veux donc avec ta requête parcourir toute ta table T1 pour actualiser T2 ? Alors pour les BDD différentes, Sabotage disait de noter ta table BDD1.T1 et BDD2.T2 au lieu de juste T1 et T2 je crois... Ensuite, pour la requête, euh ... Là comme ça je ne vois...
s.lennon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2010, 12h00   #18
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Salut tout le monde en ce vendredi béni qui annonce le week-end

Ce matin j'ai pris mon courage à deux mains et j'ai fait un script Php pour faire ma mise à jour, j'ai fait une variable $table_source car j'ai plusieurs table source en fait

Code :
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
 
$table_source = 'trodat_tampon';
 
echo "<h1>--- Debut de la mise à jour des prix ---</h1>";
 
echo "<h2>--- Traitement de la table $table_source ---</h2>";
 
echo "<h3>Connexion à la base xxx</h3>";
 
$bdd_machine = "localhost";
$bdd_compte = "admin";
$bdd_bdd="xxx";
$bdd_motpasse = "xxx";
 
$connect=mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
mysql_select_db($bdd_bdd,$connect);
unset($bdd_motpasse);
 
$tableau = array();
 
$sql = "SELECT reference, prix FROM $table_source ORDER by reference";
echo "$sql<br /><br />";
$result = mysql_query($sql);
while($data = mysql_fetch_array($result)){
  //on recupere la reférence et le prix
  $reference = $data['reference'];
  $prix = $data['prix'];
 
  //echo "$reference -> $prix<br /><br />";
 
  //on stocke dans un tableau les référence et les prix;
  $tableau[$reference] = $prix;
}
 
//print_r($tableau);
 
//maintenant on parcourt le tableau pour récupérer référence et prix
foreach($tableau as $cle=>$valeur){
    echo "$cle -> $valeur<br>";
    echo "Connection à la base 3 clics<br />";
    $bdd_machine = "localhost";
    $bdd_compte = "admin";
    $bdd_bdd="xxx";
    $bdd_motpasse = "xxx";
 
    $connect=mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
    mysql_select_db($bdd_bdd,$connect);
    unset($bdd_motpasse);
    echo "Connecté à la base<br />";
 
    //on forme la requêt d'update de la table article2
    $sql = "UPDATE article2 SET tarifPublicHT = '$valeur' WHERE reference = '$cle'";
    echo "$sql<br />";
    mysql_query($sql);
    echo "Mise à jour effectuée<br /><br />";
 
}
 
?>
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2010, 21h13   #19
Membre du Club
 
Avatar de s.lennon
 
Stéphanie Lennon
Inscription : juin 2009
Messages : 66
Détails du profil
Informations personnelles :
Nom : Stéphanie Lennon
Âge : 26

Informations forums :
Inscription : juin 2009
Messages : 66
Points : 55
Points : 55
Bonsoir.

Tu peux tout faire en "une fois", sans stocker tes données de T1 dans un tableau je pense. Mais surtout, attention à ta requête de mise à jour : les références n'étant pas identiques, il faut un LIKE dans ta close WHERE, et non un égal...

Code :
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
<?php
  $table_source = 'trodat_tampon';
 
  // CONNEXION A LA BDD 1
  $bdd_machine = "localhost";
  $bdd_compte = "admin";
  $bdd_bdd = "xxx";
  $bdd_motpasse = "xxx";
 
  $connect_bdd1 = mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
  mysql_select_db($bdd_bdd, $connect_bdd1);
  unset($bdd_motpasse);
 
  // CONNEXION A LA BDD 2
  $bdd_machine = "localhost";
  $bdd_compte = "admin";
  $bdd_bdd = "xxx";
  $bdd_motpasse = "xxx";
 
  $connect_bdd2 = mysql_connect($bdd_machine,$bdd_compte,$bdd_motpasse);
  mysql_select_db($bdd_bdd, $connect_bdd2);
  unset($bdd_motpasse);
 
  // SELECTION DES DONNEES DANS BDD 1
  $sql = "SELECT reference, prix FROM $table_source ORDER by reference";
  $result = mysql_query($sql, $connect_bdd1);
 
  while($data = mysql_fetch_array($result)){
    //on recupere la reférence et le prix
    $reference = $data['reference'];
    $prix = $data['prix'];
 
    // MISE A JOUR DE LA TABLE 2 : on forme la requête d'update de la table article2
    $sql = "UPDATE article2 SET tarifPublicHT = '$prix' WHERE reference LIKE '".$reference."%'";
    mysql_query($sql, $connect_bdd2);
  }
 
  // FERMETURE DES CONNEXIONS
  mysql_close($connect_bdd2); 
  mysql_close($connect_bdd1); 
?>
A tester... Tiens-nous au courant

[edit] Attention aussi au temps que prennent tes requêtes. MySQL déconnecte au bout de 30s par défaut je crois...
s.lennon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2010, 08h11   #20
Membre confirmé
 
Avatar de BenoitDenis
 
Inscription : avril 2005
Messages : 538
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : avril 2005
Messages : 538
Points : 219
Points : 219
Envoyer un message via MSN à BenoitDenis
Hello, en fait je suis passé par un tableau car c'est ce que je maitrise le mieux, et j'ai mis égal car en fait c'est égal j'avais mal vu, tout a fonctionné et est à jour

Pour les temps d'exec c'est un select simple et un update donc pas de souci

merci à tous
__________________
Le contenu est roi, optimisé il est empereur...

Comme la Hongrie, le monde informatique a une langue qui lui est propre. Mais il y a une différence. Si vous restez assez longtemps avec des Hongrois, vous finirez bien par comprendre de quoi ils parlent.

http://www.tethis-interactive.com
BenoitDenis 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 +1. Il est actuellement 13h13.


 
 
 
 
Partenaires

Hébergement Web