PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 11-02-2014 21:32:36

rabolio
Membre
Inscription : 11-02-2014
Messages : 4

update d'une table à partir d'une autre

Bonjour à tous

je sèche depuis 2 jours sur ce souci

j'ai une table de plusieurs milliers d'articles
je dois la mettre à jour avec d'autres tables que je reçois chaque jour

la base générale "bracobase", que je dois mettre à jour
la base "bracoimport" que je reçois (différente chaque jour)

après de nombreuses recherches , j'essaye ce script. je n'arrive à rien

merci pour votre aide. J'en ai bien besoin...

<?
include('../../Connection.php');

        $sql="    UPDATE bracobase
                SET    bracobase.art_prix_brut = bracoimport.b_art_prix_brut
                FROM   bracobase    
                INNER JOIN bracoimport ON bracoimport.b_art_ean = bracobase.art_ean    ";

             if ($res=mysql_query($sql) )
                                  { echo bracoimport.b_art_ean;}
             else {echo mysql_error();}
            
?>

Hors ligne

#2 12-02-2014 05:44:46

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : update d'une table à partir d'une autre

Bonjour,


Si c'était si simple (ça l'est presque^^), j'aurais presque envie de dire, que ça serait trop facile^^
En fait la méthodologie va dépendre en premier lieu du moteur base de données que vous utilisez MySQL, postGreSQL, SQLServer, un autre?
La deuxième chose à prendre en compte, est de considérer les informations à rapprocher.

Votre méthodologie sous-entend les choses suivantes:
- Que le nombre de lignes contenues dans bracoimport est toujours strictement identique à celui contenu dans la table bracobase.
- Que la seule information à mettre à jour (l'unique source de variabilité à prendre en compte) est le prix brut des articles.
- Que la colonne "art_ean" de votre table bracobase constitue la clé primaire (identifiant unique) de vos articles; qu'il en est de même pour la colonne "b_art_ean" de la table bracoimport, et enfin que chacune de ces mêmes clé primaires identifient respectivement les même articles au sens métier de votre activité.

Or, vu votre souci, je suppose qu'une au moins des affirmations ci-dessus ne correspond pas à votre cahier des charges ou à votre réalité.

A bientôt de vous lire.

EDIT: Votre code PHP, après votre requête, est, de plus, invalide car
1) votre requête ne retourne aucun enregistrement car il s'agit d'un update
2) si votre requête était un SELECT, il faudrait faire pour le moins un fetch sur votre resultset pour accéder au contenu.

Dernière modification par Jc (12-02-2014 07:49:06)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 13-02-2014 08:03:51

rabolio
Membre
Inscription : 11-02-2014
Messages : 4

Re : update d'une table à partir d'une autre

Bonjour et merci pour votre réponse

je dirai qu'elle est plus claire que ma question... et comme débutant, c'est vraiment appréciable
cela a le mérite de susciter la réflexion.

Vous avez raison sur tous les points.
     - Le premier et qui sera incontournable, c'est le nombre de lignes qui sera rarement identique
     - Le deuxième, c'est que j'aurai plusieurs champs à modifier

Quel serait votre conseil pour la méthodologie
j'ai également essayé une boucle de lecture sur la table à importer
avec un update à chaque ligne, mais mon script ne doit pas être à la hauteur:
mon résultat est médiocre. On ne peut pas débuter et tout réussir

précision: Il s'agit de MYSQL sur le serveur d'Infomaniak

merci pour vos conseils

Hors ligne

#4 13-02-2014 16:00:20

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : update d'une table à partir d'une autre

Bonjour,

- Le premier et qui sera incontournable, c'est le nombre de lignes qui sera rarement identique
- Le deuxième, c'est que j'aurai plusieurs champs à modifier

Avant de répondre quant à la méthodologie, il reste à savoir encore quelques petites choses qui ont leur importance à savoir:
- Si le nb de lignes de bracoimport > nb de lignes de bracobase : Doit-on créer les articles en plus dans bracobase ? Si non quelle est la règle à appliquer?
- Si le nb de lignes de bracoimport < nb de lignes de bracobase : Doit dont supprimer les articles en trop dans bracobase ou simplement les "désactiver"? Si non, quelle(s) est/sont la règle/les règles à appliquer?
- Combien de colonnes peuvent être mises à jour? quantité variable? toujours invariante et systématique ?

++

Dernière modification par Jc (15-02-2014 11:47:18)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 13-02-2014 19:56:30

rabolio
Membre
Inscription : 11-02-2014
Messages : 4

Re : update d'une table à partir d'une autre

Bonjour

pour être un peu plus précis

la table "bracobase" va contenir 6-700.000 lignes, probablement plus
il n'y aura pas de suppression de ligne
j'y inclus simplement un champs "visible/invisible" qui fera le tri
L'ajout dans cette table sera courant et se fait de façon simple à partir de l'interface d'Infomaniak et de fichier CSV

la table bracoimport devrait rarement dépasser les 10.000 lignes, souvent proche de 1000.
c'est ici que je m'interroge. Deux boucles imbriquées avec autant de lignes...

a priori le nombre de colonne modifiées par "action", devrait être de 3, mais variable de 1 à 3

merci pour votre soutien

Hors ligne

#6 24-02-2014 18:13:52

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : update d'une table à partir d'une autre

Bonjour,

Le gros problème avec MySQL c'est qu'aucun de ses moteurs n'est taillé pour faire de la comparaison de données du fait principalement du non support des instructions INTERSECT et EXCEPT du standard SQL qui permettent d'exclure des ensembles de données ou d'en extraire l'intersection et évite donc de faire de l'itératif, complétement contre-productif dans ce genre de tâche.

Je profite de l'occasion pour dire que c'est encore une raison qui démontre que le choix d'un SGBDR sur le seul critère de la volumétrie de données à traiter est complètement absurde.

Ceci étant dit dans votre malheur, si je puis m'exprimer ainsi c'est que vous n'avez que 3 colonnes au maximum à évaluer dans cette comparaison ce qui est une chance en soit.
Ce qu'il faut savoir maintenant, c'est si parmi ces trois colonnes vous avez une colonne de type chaîne de caractères à évaluer. L'idéal pour ce genre de comparaison est de travailler sur une collation binaire (ou pour le moins sensible à la casse) ou de travailler directement sur un type  BINARY ou VARBINARY. Le problème étant, pour ce genre de choix, de le prévoir lors de la conception, j'en conviens.
Si vous êtes sur une collation normale, faites vos comparaisons en utilisant LOWER(chaîne1)=LOWER(chaîne2)

Ensuite si les 3 colonnes concernées n'ont pas d'index, je vous conseille fortement de les indexer et pour le moins le temps de la comparaison si vous procédez par comparaison exacte, sinon laissez ces colonnes en l'état (sans index) si vous faites une mise à jour globale (méthode exposée ci-après).

Une fois ceci fait, vous réduirez considérablement les temps de traitement pour votre comparaison et ceci, d'autant plus que votre nombre de lignes à traiter est important. En moyenne vous pouvez considérer un x10 en gain de temps avec au moins une chaîne de caractères à traiter, mais cela peut être très variable, car cela dépends de beaucoup de facteurs dont nous n'avons aucun élément pour ce qui vous concerne.

Avant de faire votre comparaison je vous conseillerais ensuite de faire un pré-traitement qui consiste à l'aide de jointures à mettre à jour votre indicateur de désactivation de ligne (Cf.

j'y inclus simplement un champs "visible/invisible" qui fera le tri

)
en utilisant par exemple l'effet null sur une jointure externe à la table.

ex : UPDATE bracobase as t0 LEFT JOIN bracoimport as t1 SET t0.is_active=true WHERE t0.id=t1.id AND t2.macolonne NOT NULL
      UPDATE bracobase as t0 LEFT JOIN bracoimport as t1 SET t0.is_active=false WHERE t0.id=t1.id AND t2.macolonne IS NULL

PS: vérifiez la syntaxe car ca fait longtemps que je ne travaille plus sous MySQL et je ne suis plus certain de la syntaxe surtout pour les UPDATE, qui restent particuliers sous MySQL en terme d'écriture et de possibilités. Au pire vous serez obligé de passer par une table temporaire pour faire l'update sur bracobase ou encore une vue comme suit:


INSERT INTO ma_vue (liste des colonnes de bracoimport dans l'ordre) SELECT t1.id, (suite des colonnes de bracoimport dans l'ordre) FROM bracoimport AS t0 LEFT JOIN bracobase as t1 ON t0.id=t1.id WHERE t1.is_active=true AND t0.unecolonne NOT NULL ;
 

Ce préfiltrage peut donc vous éviter de faire un full scan sur quelques % de l'ensemble des enregistrement de bracobase pour la comparaison et donc vous faire gagner du temps.

Ensuite évitez d'identifier sous MySQL quelle colonne à mettre à jour surtout si chaîne à collation non binaire, et préférez une mise à jour globale surtout dans votre cas vu que vous n'avez que 3 colonnes à mettre à jour au max. Ce que je vous ai proposé précédemment va dans ce sens, et vous pourrez faire pour terminer :


UPDATE bracobase AS t0, ma_vue AS t1 Set t0.col1=t1.col1, t0.col2=t1.col2, t0.col3=t1.col3 WHERE t0.id=t1.id
 

Voilà, s'il y a des choses que vous ne comprenez pas, demandez wink

Dernière modification par Jc (25-02-2014 11:16:07)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 01-03-2014 20:55:50

rabolio
Membre
Inscription : 11-02-2014
Messages : 4

Re : update d'une table à partir d'une autre

Bonjour

merci pour vos réponses et le temps que vous avez bien voulu y consacrer
pour ma part, je pense que je vais m'inscrire sur phpprédébutant

merci encore
ps: je vais essayer quand même

Hors ligne

Pied de page des forums