[RESOLU] Comparaison de table MySQL

Eléphant du PHP | 291 Messages

07 mars 2008, 19:42

Bonsoir,

J'ai un petit problème avec un bout de code, j'ai un deux tables identiques, deux champs chacune :

Original : id_1 | id_2
Tmp : id_1 | id_2


je cherche à comparer ces deux tables afin de mettre l'original à jour mais je ne sais pas comment m'y prendre, tableau ? jointure ?

Un exemple concret :

- Si dans la table Tmp j'ai un enregistrement qui ne figure pas dans la table Original je l'ajoute dans la table Original
- Si un enregistrement dans la table Tmp est déjà présent dans la table Original, je ne fais rien
- En revanche si un enregistrement est présent dans la table Original mais pas dans la table Tmp je le supprime de la table Original.


J'espère avoir été clair dans cet exemple.

Si vous pouviez m'aider ?

D'avance merci

Eléphanteau du PHP | 27 Messages

07 mars 2008, 22:43

lorsque tu dis "tables" tu parles de tableau au sens variable php ou au sens sql ? Du côté de php il y a pas mal de fonction capable d'associer/différencier/fusionner/interseter... :D je te renvoi vers la doc

ViPHP
ViPHP | 2144 Messages

07 mars 2008, 23:12

Ce que tu veux faire est plus que probablement faisable en sql, mais cela dépend fortement du serveur sql que tu utilises (Mysql ?) et de sa version.

Par exemple, il est possible d'utiliser le résultat d'un select pour réaliser une insertion dans une autre.

Je te conseillerai de jeter un coup d'œil à la documentation correspondant à ton serveur.

Eléphant du PHP | 291 Messages

08 mars 2008, 00:47

Bonsoir,

Les tables sont effetivement des tables sql, c'est un serveur linux apache 2/mysql 4.1.20

Le fait par exemple de pouvoir "utiliser le résultat d'un select pour réaliser une insertion dans une autre", porte un nom ?

D'avance merci

ViPHP
ViPHP | 1996 Messages

08 mars 2008, 03:28

Un truc du genre a des chances de marcher :

Code : Tout sélectionner

Original : id_1 | id_2 Tmp : id_1 | id_2
$query : "SELECT * FROM `Tmp` LEFT JOIN `Original` ON `Original`.`id_1` != `Tmp`.`id_1`";
//si un id_1 n'est présent que dans Tmp
Ensuite tu fais un mysql_fetch_row par exemple :
While ($row = mysql_fecth_row($resultat_sql))
{
$query = "INSERT INTO `Original` (`id_1`,`id_2`) VALUES ('$row[0]','$row[1]')";
mysql_query($query);
}
As tu compris le principe ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 291 Messages

08 mars 2008, 18:43

Bonsoir,

j'ai bien compris le principe (je crois), donc selon l'exemple suivant :

Original : ido_1 | ido_2
Tmp : idt_1 | idt_2

j'ai fais ceci :
<?php
$sql = "SELECT * FROM `Tmp` LEFT JOIN `Original` ON `Original`.`ido_1` != `Tmp`.`idt_1`";
$req = mysql_query($sql) or die('Erreur : SELECT');

While ($row = mysql_fecth_row($req)) {
$query = "INSERT INTO `Original` (`ido_1`,`ido_2`) VALUES ('$row[0]','$row[1]')";
$req = mysql_query($query ) or die('Erreur : INSERT');
}
?>
Le problème c'est qu'il n'exécute pas le while.
Dans phpmyadmin il m'exécute bien le SELECT par contre.

je ne vois pas l'erreur..
si vous pouvez m'aiguiller ?

d'avance merci

Eléphanteau du PHP | 28 Messages

09 mars 2008, 11:05

Salut bunk,

A mon avis, nome différemment la requête qui te sert pour la boucle, et celle qui est dans la boucle (elle s'appelle toutes les deux $req).

Bonne journée !

Eléphant du PHP | 291 Messages

09 mars 2008, 14:22

Bonjour,

en fait j'avais déjà testé, c'est possible que cela vienne de la version de mysql ?

sinon je vois pas autre chose.

Une idée ?

D'avance merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

09 mars 2008, 15:42

Il te faut effectivement donner un nom différent à tes deux ressources, sinon au premier passage dans le while elle est écrasée par la 2nd

Essaye de déterminer quel est le problème exactement, n'hésite pas à coller des echo pour vérifier par où passe php et avec quelles valeurs, cela te permettra d'identifier beauxoup plus facilement le problème :

Si php n'entre effectivement pas dans le while, c'est que la condition est fausse, donc que mysql_fecth_row($req) ne contient pas de résultat, donc que ta requête n'a pas retourné d'enregistrement. Affiche ta requête SELECT, exécute là dans MySQL et vérifie qu'elle retourne bien ce que tu attends.

Par ailleurs, tu fais un "SELECT *" et tu utilises ensuite $row[0] et $row[1] ... es-tu sur de l'ordre dans lequel ta requête retourne les champs de ta table ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 291 Messages

10 mars 2008, 11:21

Bonjour,

Merci Ryle, j'ai fais les test pour comprendre.

Alors si j'affiche le premier SELECT pour exécuter dans phpmyadmin il me retourne bien la liste des combinaisons : idt_1 | idt_2 | ido_1 | ido_2 avec les valeurs quand l'enregistrement n'est pas dans Original et NULL si il trouve ido_1 dans Original, d'ailleurs il m'affiche NULL mais l'enregistrement n'est pas forcément dans Original, la ils base uniquement sur idt_1

sinon impossible de rentrer dans le While et d'afficher row[], bi même un echo "test";, je dirais qu'il arrête d'exécuter le code, si je commente cette boucle il exécute le code de ma page en entier.

je n'ai pas d'erreur d'exécution non plus, je ne sais pas ce que je cherche en fait, je suis un peu bloqué. y'a t'il un moyen de tester le code d'une manière différente ?


D'avance merci

Eléphant du PHP | 291 Messages

11 mars 2008, 14:58

Bonjour,

tout les test que j'ai effectués me donne toujours la même chose, je n'arrive pas a rentrer dans la boucle While, je suis à la recherche d'une solution de contournement.

Quelqu'un pourrait tester ce bout de code sur une autre version de php/mysql pour me confirmer (ou pas) que cela pourrait venir de la ?


Merci pour votre aide.

Eléphant du PHP | 291 Messages

17 mars 2008, 18:21

Bonjour,

Après plusieurs test de solutions de contournement non fructueuses je ne parviens pas à solutionner ce problème. Quelqu'un pourrais t'il faire le test sur une version différente de php/mysql pour me confirmer ou pas que cela pourrait venir de la ?

je peux mettre le code pour la création de la table et la boucle si besoin.

D'avance merci

TitiMatt
Invité n'ayant pas de compte PHPfrance

17 sept. 2021, 09:33

Bonjour,

Ca fait longtemps et je pense que, depuis, la solution a été trouvée mais, au cas où :

Code : Tout sélectionner

$sql = "SELECT * FROM `Tmp` LEFT JOIN `Original` ON `Original`.`ido_1` != `Tmp`.`idt_1`"; $req = mysql_query($sql) or die('Erreur : SELECT'); While ($row = mysql_fetch_row($req)) { $query = "INSERT INTO `Original` (`ido_1`,`ido_2`) VALUES ('$row[0]','$row[1]')"; $req1 = mysql_query($query ) or die('Erreur : INSERT'); }
C'est mysql_feTCh_row et pas mysql_feCTh_row.
Et j'ai rajouté un 1 derrière $res pour la requête de ton insert.

Bonne journée

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

17 sept. 2021, 11:23

J'espère aussi qu'il est passé à autre chose depuis le temps, mais bien vu pour la faute de frappe ! :-D
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 291 Messages

17 mai 2025, 16:10

hello, je suis effectivement passé à autre chose mais j'avais loupé cette réponse !
merci pour votre aide :)