Interaction entre deux Tables

Petit nouveau ! | 7 Messages

29 juil. 2012, 11:49

Bonjour,
j ai deux tables que j aimerais mettre en relation =

la premiere table est COD_DB avec id_cod , cod_ape, et cod_sit, toutes les colonnes sont remplies
la deuxième est SIT_DB avec id_sit, sit_ape, et sit_cod, il y a tous les id_sit et sit_cod, la colonne sit_cod est vide

Comment faire pour remplir la colonne sit_cod de la table SIT_DB en fonction de la table COD_DB ?

Merci, je vous joins le start ne fonctionnant pas :
<?php
require "cnt.php";

$query = 'SELECT cod_ape,cod_sit FROM COD_DB';
$query1 = 'SELECT sit_ape,sit_cod FROM SIT_DB';
$results = mysql_query($query);
$results1 = mysql_query($query1);

$cod_ape_1;
while($line = mysql_fetch_assoc($results)) {
	$cod_ape_1 = $line["cod_ape"];
	while($line1 = mysql_fetch_assoc($results1)) {
			echo $cod_ape_1;
		if($cod_ape_1 == $line1["sit_ape"]){
		}
	}
}

mysql_close(mysql_connect($db_host, $db_username, $db_password, $db_name));
?>

ViPHP
AB
ViPHP | 5818 Messages

29 juil. 2012, 18:46

Pour mettre à jour une table il faut utiliser la commande "update". Après pour t'en dire plus il faudrait que tu nous détaille les relations entre les colonnes des différentes tables.

Petit nouveau ! | 7 Messages

29 juil. 2012, 20:34

merci pour ta réponse, je dois etre plus explicite, effectivement. Voici le besoin :

la premiere table est COD_DB avec id_cod , cod_ape, et cod_sit, toutes les colonnes sont remplies

id_cod cod_ape cod_sit
0 120A 255555
1 130A 355555
2 140A 455555
3 150A 555555

la deuxième est SIT_DB avec id_sit, sit_ape, et sit_cod, il y a tous les id_sit et sit_cod, la colonne sit_cod est vide

id_sit sit_ape sit_cod
0 140A
1 130A
2 150A
3 120A


Comment faire :
si 'sit_ape' de la table SIT_DB = 'cod_ape' de la table COD_DB, alors 'sit_cod' de la table SIT_DB = 'cod_sit' de la table COD_DB

Merci beaucoup pour vos réponses

Petit nouveau ! | 7 Messages

30 juil. 2012, 15:19

Pour mettre à jour une table il faut utiliser la commande "update". Après pour t'en dire plus il faudrait que tu nous détaille les relations entre les colonnes des différentes tables.
merci pour ton aide, j aurais vraiment besoin d une piste

ViPHP
AB
ViPHP | 5818 Messages

30 juil. 2012, 19:43

UPDATE SIT_DB 

INNER JOIN COD_DB ON COD_DB.cod_ape = SIT_DB.sit_ape 

SET SIT_DB.sit_cod = COD_DB.cod_sit 

Petit nouveau ! | 7 Messages

01 août 2012, 09:11

Bonjour,
apres exécution toute la table est vidée.

Je fais un UPDATE > SET > WHERE

aurais-tu une idée ? merci
<?php
require "cnt.php";
$query2 = 'UPDATE SIT_DB, COD_DB SET SIT_DB.sit_cod = COD_DB.cod_sit WHERE SIT_DB.sit_ape = COD_DB.cod_ape';
mysql_query($query2);

mysql_close(mysql_connect($db_host, $db_username, $db_password, $db_name));
?>

Petit nouveau ! | 7 Messages

01 août 2012, 09:43

j ai également fait avec INNER JOIN et table vidée, effacée !

<?php
require "cnt.php";
$query2 = 'UPDATE frpro INNER JOIN code_e1er ON frpro.cod_ape = code_e1er.cod_ape SET frpro.cod_e1er = frpro.cod_e1er';
mysql_query($query2);

mysql_close(mysql_connect($db_host, $db_username, $db_password, $db_name));
?>


ViPHP
AB
ViPHP | 5818 Messages

01 août 2012, 18:19

J'ai fait un petit jeu de test avec ces tables :
-- --------------------------------------------------------

--
-- Structure de la table `cod_db`
--

CREATE TABLE IF NOT EXISTS `cod_db` (
  `id_cod` int(11) NOT NULL,
  `cod_ape` varchar(100) CHARACTER SET utf8 NOT NULL,
  `cod_sit` varchar(100) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id_cod`),
  UNIQUE KEY `cod_ape` (`cod_ape`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `cod_db`
--

INSERT INTO `cod_db` (`id_cod`, `cod_ape`, `cod_sit`) VALUES
(0, '120A', '255555'),
(1, '130A', '355555'),
(2, '140A', '455555'),
(3, '150A', '555555');

-- --------------------------------------------------------

--
-- Structure de la table `sit_db`
--

CREATE TABLE IF NOT EXISTS `sit_db` (
  `id_sit` int(11) NOT NULL,
  `sit_ape` varchar(100) CHARACTER SET utf8 NOT NULL,
  `sit_cod` varchar(100) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id_sit`),
  UNIQUE KEY `sit_ape` (`sit_ape`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `sit_db`
--

INSERT INTO `sit_db` (`id_sit`, `sit_ape`, `sit_cod`) VALUES
(3, '120A', ''),
(2, '150A', ''),
(0, '140A', ''),
(1, '130A', ''),
(4, '144A', '');
ensuite si je rentre la requête ci-dessous, tout fonctionne comme attendu :
UPDATE SIT_DB

INNER JOIN COD_DB ON COD_DB.cod_ape = SIT_DB.sit_ape

SET SIT_DB.sit_cod = COD_DB.cod_sit
La colonne "sit_cod" de la table "sit_db" est bien remplie avec les valeurs "cod_sit" de la table "cod_db" quand la valeur du champ "cod_ape" de la table "cod_db" est égal à la valeur du champ "sit_ape" de la table "sit_db".
C'est bien ce que tu avais demandé, non ? essaies en copiant collant simplement mon jeu de test dans une fenêtre sql de phpmyadmin.

Petit nouveau ! | 7 Messages

03 août 2012, 10:58

Bonjour AB, ça a fonctionné super avec 90 lignes en passant par mysql.

J ai essayé sur 4 000 000 de lignes (je dois convertir toutes ces données !) et ça ne fonctionne pas.

Aurais tu une idée pour avoir une validation en écho toutes les 5000 lignes ?

Voici le script adapté à ton astuce mais qui semble ne jamais aboutir, pourquoi ?

Merci
<?php
$con = mysql_connect("host","user","passe");
mysql_select_db("admin", $con);
//
$query = "UPDATE SIT_DB INNER JOIN COD_DB ON COD_DB.cod_ape = SIT_DB.sit_ape SET SIT_DB.sit_cod = COD_DB.cod_sit";
$results = mysql_query($query);
//
while($line = mysql_fetch_assoc($results)) {
	echo $line["db_cible.soc_e1er"];
}
mysql_close($con);
?>

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

03 août 2012, 14:50

salut,

mysl_query ne fournit pas de jeux de résultat sur un update
Pour les autres types de requêtes, INSERT, UPDATE, DELETE, DROP, etc., mysql_query() retourne TRUE en cas de succès ou FALSE en cas d'erreur.
la doc => http://fr2.php.net/mysql_query

ton code ne peux donc pas fonctionner au mieux tu aura une erreur car mysql_fetech_assoc demande une ressource et non un booleen ;)
Voici le script adapté à ton astuce mais qui semble ne jamais aboutir, pourquoi ?
parce que traiter 4 million de ligne demande plus de trente seconde et que le time out, par défaut, d'un script php est de trente seconde ? :)

si ceci est un "one shoot" n'utilise pas php mais un client mysql plus complet déja existant (phpmyadmin, mais soumis au time out je pense) ou d'autre (mysql workbench, heidiSQL etc), voir simplement le client mysql en ligne de commande, c'est fait pour cela ;)

@+
Il en faut peu pour être heureux ......

ViPHP
AB
ViPHP | 5818 Messages

03 août 2012, 15:17

J'étais parti sur une jointure parce qu'au moment de te répondre je travaillais sur des jointures mais la syntaxe plus classique est :
UPDATE COD_DB, SIT_DB 

SET SIT_DB.sit_cod = COD_DB.cod_sit

WHERE COD_DB.cod_ape = SIT_DB.sit_ape
...c'est peut être plus rapide.

Cela dit, 4 millions de lignes cela commence à faire pas mal. Tu fais ça comment, sur un serveur distant linux, ou chez toi en local sur window ? Dans le second cas (sur window) la directive max_execution_time doit être changée car les appels mysql sont inclus dans le temps d'exécution maximum qui est certainement trop court (alors que normalement les appels bdd ne comptent pas pour cette directive sous unix, d'après la note dans set_time_limit). Il y a peut-être aussi des directives côté serveur mysql... (je suis pas spécialiste de l'administration serveur)

Si tu ne peux pas modifier ces paramètres et que tu n'as pas pu ou su suivre les conseils de moogli tu peux toujours faire plusieurs passes en te basant sur les id que tu sélectionnera en plus dans la clause WHERE genre WHERE COD_DB.cod_ape = SIT_DB.sit_ape AND COD_DB.id >= 0 AND COD_DB.id <= 100000 pour une première passe concernant les id jusqu'à 100000; pour les passes suivantes tu incrémente de la même valeur WHERE COD_DB.cod_ape = SIT_DB.sit_ape AND COD_DB.id >= 100000 AND COD_DB.id <= 200000 etc.

Petit nouveau ! | 7 Messages

03 août 2012, 16:56

Je vais tester, je suis en local sur une station mac avec MAMP pour le serveur virtuel. php/mysql

Merci