Aide - Recherche - Membres - Calendrier
Version complète : comparaison / mise à jour entre deux tables
Forum osCommerce-fr > Adapter OsCommerce MS2 > Echanges développeurs
Havock
Je suis en train de mettre en place une interface basique pour récupérer des infos de mon logiciel de gescom et l'intégrer à ma boutique et comme c'est la fin de journée et vendredi j'ai un doute sur la meilleure façon de faire une manip.

J'ai deux tables de plusieurs milliers de lignes chacune (sans doublon) : Par exemple
T1 avec les colonnes : id et stock
T2 avec la même structure, mais pas forcément exactement les mêmes données (il peut y avoir des données présentes dans T2 et pas dans T1).

L'idée est de mettre à jour les données stock de T1 à partir de celles de T2, sachant que je ne veux pas transférer dans T1 les données présentes dans T2 et pas dans T1

Ce n'est pas vraiment difficile, mais je m'interroge sur la méthode la plus rapide et la plus propre de procéder.

Avec un simple update :
Code
sql0 = tep_db_query("select * from T2)
while ($results00 = tep_db_fetch_array($sql00)) {
tep_db_query("update T1 set stock ='".$results00['stock']."' where id ='" . $results00['id'] . "'");
}



Avec une requete update avec jointure ?

Avec une première requete pour virer de T2 les lignes non présentes dans T1, suivi d'un simple update ?

Meric pour vos avis éclairés blush.gif
Gnidhal
outre les petits problèmes de syntaxe de nom (sql0 != sql00) par exemple, ta requête devrait te retourner une erreur à la première donnée présente dans t2 mais pas dans t1.
Si t1 est la référence en matière de liste de données, il est plus judicieux de partir d'elle pour faire ta mise à jour.

Code
$sql_query = tep_db_query(" select * from t1");
while (sql_array = tep_db_fetch_array($sql_query)){
  $sql2_query = tep_db_query("select * from t2 where id = '".sql_array['id']."'");
  $sql2_a = tep_db_fetch_array($sql2_query);
  if ($sql2_a['stock'] != $sql_array['stock'])
     tep_db_query ("update t1 set stock = '".$sql2_a['stock']."' where id = '".$sql2_a['id']."' ");
}

bon à vérifier pour la syntaxe bien sur, c'est tapé ici sans filet.
Mais tu fais l'économie des requêtes d'update inutiles.
Tu aurais aussi pu limiter la liste dans le première requête avec une jointure de comparaison, ainsi on ne scanne pas toutes les lignes, mais seulement celles qui présentent un delta...
$sql_query = tep_db_query( "select * from t1, t2 where t1.id = t2.id and t1.stock <> t2.stock ");
ou
$sql_query = tep_db_query( "select * from t1 left join t2 using id where t1.stock <> t2.stock ");
mais pas sur que cette dernière ne te sorte pas justement les t2.id qui ne sont pas dans t1, pas testé.
Havock
Citation
outre les petits problèmes de syntaxe de nom (sql0 != sql00) par exemple,
blush.gif blush.gif blush.gif Houla on voit que c'était vendredi soir !

J'ai finalement opté pour une requête avec jointure du style :
Citation
$sql_query = tep_db_query( "select * from t1 left join t2 using id where t1.stock <> t2.stock ");

Dans la mesure où on fait un left join sur T1 (qui est la table la plus petite) ça passe sans soucis.

Merci pour le coup de pouce Gnidhal (entre "vieux" il faut bien s'aider, sinon on va se faire bouffer par les jeunes) wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2013 Invision Power Services, Inc.