[RESOLU] Compléter une table SQL à partir d'une autre

Eléphant du PHP | 67 Messages

31 août 2012, 11:28

Bonjour,

J'ai deux tables MySQL T1 et T2 avec un champ appelé Nr dans la T1 et HNr dans la T2
Je voudrais remplir ce champ HNr (ajouter un record) dans la T2 à partir de la T1 uniquement s'il n'existe pas déjà dans la T2, en lançant périodiquement une petite requête dans une page PHP.

J'ai essayé quelques fonctions INSERT et UPDATE trouvées sur Internet mais je ne m'en sort pas

Un grand merci d'avance pour votre aide

Philippe

ViPHP
ViPHP | 2577 Messages

31 août 2012, 11:49

Peut être :
update t1,t2 set hnbr = nbr where t1.id = t2.id and hnbr < nbr
et
insert into t2 values (select "liste des colonnes" from t1 where t1.id not in (select id from t2))
Pour select "liste des colonnes" from t1 where t1.id not in (select id from t2), une jointure (left joint) en testant la nullité de la clé pour t2 serai plus propre, mais j'utilise rarement et je n'ai pas de sgbd sous la main.

Eléphant du PHP | 67 Messages

31 août 2012, 12:25

Peut être :
update t1,t2 set hnbr = nbr where t1.id = t2.id and hnbr < nbr
et
insert into t2 values (select "liste des colonnes" from t1 where t1.id not in (select id from t2))
Pour select "liste des colonnes" from t1 where t1.id not in (select id from t2), une jointure (left joint) en testant la nullité de la clé pour t2 serai plus propre, mais j'utilise rarement et je n'ai pas de sgbd sous la main.
Merci Mazarini ...
J'ai essayé ceci (avec les vraies valeurs)
<?
@ $db = mysql_connect("localhost","***","****");
mysql_select_db("employability");

$sql = "UPDATE tblAdresses,tblHisto SET HNrFiche = NrFiche WHERE tblAdresses.NrFiche = tblHisto.HNrFiche AND HNrFiche < NrFiche";
$resultat = mysql_db_query("employability", $requete) or die ('Erreur '.$requete.' '.mysql_error());
$ligne = mysql_fetch_assoc($resultat);
$sqlsend = mysql_db_query("employability", $sql) or die ('Erreur '.$sql.' '.mysql_error());

?>

mais j'ai une erreur 'QUERY WAS EMPTY'

En fait je dois rajouter des records sur la table tblHisto et ne remplir qu'un seul champ HNrFiche en allant chercher les valeurs de son champ correspondant NrFiche dans la table tblAdresses ... s'il n'existe pas déjà dans tblHisto

Merci

ViPHP
ViPHP | 2577 Messages

31 août 2012, 13:22

En fait, il faut que tu essayes les 2 requetes que je t'ai proposé. Une pour la maj et l'autre pour l'ajout.

Tu ne renseignes pas $requete qui est donc vide. Mets l'insert dans $requête. Pour éviter ce genre de problème, il faut ajouter error_reporting(E_ALL) en début de script. Ca permet de voir les variables non initialisées suite à un oubli ou une faute de frappe.

Eléphant du PHP | 67 Messages

31 août 2012, 14:16

En fait, il faut que tu essayes les 2 requetes que je t'ai proposé. Une pour la maj et l'autre pour l'ajout.

Tu ne renseignes pas $requete qui est donc vide. Mets l'insert dans $requête. Pour éviter ce genre de problème, il faut ajouter error_reporting(E_ALL) en début de script. Ca permet de voir les variables non initialisées suite à un oubli ou une faute de frappe.
Merci, Mazarini mais je ne m'en sort pas ...
Je dois mettre $requete où ?

ViPHP
ViPHP | 2577 Messages

31 août 2012, 14:35

Il faut surtout que tu mettes quelque chose dans $requetes, la requete "insert" par exemple.

Eléphant du PHP | 67 Messages

31 août 2012, 14:43

Il faut surtout que tu mettes quelque chose dans $requetes, la requete "insert" par exemple.
J'ai essayé ceci ...
<?
@ $db = mysql_connect("localhost","***","***");
mysql_select_db("employability");
$sql = "UPDATE tblAdresses,tblHisto SET HNrFiche = NrFiche WHERE tblAdresses.NrFiche = tblHisto.HNrFiche AND HNrFiche < NrFiche";
$requete = "INSERT INTO tblHisto VALUE (SELECT 'NrFiche' FROM tblAdresses WHERE tblAdresse.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto))";
$resultat = mysql_db_query("employability", $requete) or die ('Erreur '.$requete.' '.mysql_error());
$ligne = mysql_fetch_assoc($resultat);
$sqlsend = mysql_db_query("employability", $sql) or die ('Erreur '.$sql.' '.mysql_error());
?>

Et ça me renvoie cette erreur:
Erreur INSERT INTO tblHisto VALUE (SELECT 'NrFiche' FROM tblAdresses WHERE tblAdresse.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto)) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT 'NrFiche' FROM tblAdresses WHERE tblAdresse.NrFiche NOT IN (SELECT HNrFic' at line 1

ViPHP
ViPHP | 2577 Messages

31 août 2012, 14:52

VALUES pas VALUE (désolé)

Eléphant du PHP | 67 Messages

31 août 2012, 14:59

VALUES pas VALUE (désolé)
Ne soit pas désolé ... c'est déjà très sympa de passer du temps pour m'aider ...
Mais ça ne marche toujours pas :
Mon code:
<?
@ $db = mysql_connect("localhost","hma","hma153");
mysql_select_db("employability");
$sql = "UPDATE tblAdresses,tblHisto SET HNrFiche = NrFiche WHERE tblAdresses.NrFiche = tblHisto.HNrFiche AND HNrFiche < NrFiche";
$requete = "INSERT INTO tblHisto VALUES (SELECT NrFiche FROM tblAdresses WHERE tblAdresses.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto))";
$resultat = mysql_db_query("employability", $requete) or die ('Erreur '.$requete.' '.mysql_error());
$ligne = mysql_fetch_assoc($resultat);
$sqlsend = mysql_db_query("employability", $sql) or die ('Erreur '.$sql.' '.mysql_error());
?>

Le résultat:
Erreur INSERT INTO tblHisto VALUES (SELECT NrFiche FROM tblAdresses WHERE tblAdresses.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto)) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT NrFiche FROM tblAdresses WHERE tblAdresses.NrFiche NOT IN (SELECT HNrFich' at line 1

Bizarre aussi que le message d'erreur ne renvoie pas le code complet .... il manque la fin de la ligne $requete ... ???

ViPHP
ViPHP | 2577 Messages

31 août 2012, 15:38

Teste l'autre requete en premier.

Autrement, avec phpmyadmin, teste :
1) SELECT HNrFiche FROM tblHisto (sortir les identifiant déjà présent)
2) SELECT NrFiche FROM tblAdresses WHERE tblAdresses.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto) (sortir les identfiants absent et la valeur à insérer)
3) INSERT INTO tblHisto(HNrFiche) VALUES (SELECT NrFiche FROM tblAdresses WHERE tblAdresses.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto))

Edit :
3) INSERT INTO tblHisto(HNrFiche)SELECT NrFiche FROM tblAdresses WHERE tblAdresses.NrFiche NOT IN (SELECT HNrFiche FROM tblHisto)
(je viens de regarder la doc^^)

Eléphant du PHP | 67 Messages

31 août 2012, 19:34

Merci Mazarini ... c'est vraiment sympa de m'avoir aidé ...
Tout à l'air d'être correct et de fonctionner