IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Doublons quelle horreur [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Je ne m'explique pas le phénomène de la boucle.

    Si je met le traitement comme ceci avec un echo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $sql='UPDATE maj_mesure 
    				  SET ".$champ."=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers
    			  	  WHERE tiers_type_id="$d["tiers_type_id"]"
    			  	  AND tiers_nom="addslashes($d["tiers_nom"])"
    			  	  AND tiers_adr1="addslashes($d["tiers_adr1"])" 
    			 	  AND tiers_adr2="addslashes($d["tiers_adr2"])"
    			 	  AND tiers_adr3="addslashes($d["tiers_adr3"])")
    			 	  WHERE mesure_id=$ligne[0]';
    echo "1";
    //		$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    			}
    		}
    	}
    }
    Ma page de traitement reste à blanc et le traitement est très rapide.

    Si je remplace mon écho comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $sql='UPDATE maj_mesure 
    				  SET ".$champ."=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers
    			  	  WHERE tiers_type_id="$d["tiers_type_id"]"
    			  	  AND tiers_nom="addslashes($d["tiers_nom"])"
    			  	  AND tiers_adr1="addslashes($d["tiers_adr1"])" 
    			 	  AND tiers_adr2="addslashes($d["tiers_adr2"])"
    			 	  AND tiers_adr3="addslashes($d["tiers_adr3"])")
    			 	  WHERE mesure_id=$ligne[0]';
    echo "$sql";
    //		$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    			}
    		}
    	}
    }
    Alors le traitement est long et j'ai des pages et des pages de $sql

    Comprends pas bien ce qui se passe.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Waouh, je suis largué là :-)
    je ne comprends plus le sens du script tel que modifié (si il en a gardé un).

    je pards de cette relation :


    d'apres tes infos du message de ce matin.


    avec $q je parcours toutes les entrées de "mesure_maj" (scuze je l'ai mal nommée dans mon script) jointée avec tiers en récupérant:
    champ_lie (donné par ma boucle foreach qui fournie successivement les 3 champs) , puis les valeurs a comparer qui m'aideront a récupérer le plus petit ID correspondant a ces valeurs : tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3

    donc tu n'a pas a l'englober et la boucler avec ta requete a toi.

    voilà, $q renvoie toutes les entrée de la table mesures qui me permettront d'effectuer LA vraie boucle.

    Je crois que je t'ai mélangé les pinceaux avec le foreach qui ne fait que distribuer les 3 champs à checker afin de renouveler la même opération pour chacun des 3 champs.

    pour simplifier admettons que je ne cherche à corriger que "mesure_tribunal_ouvert", donc sans foreach cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    <?php
    //recupere tous les féférence a tiers dans mesure (§§§§§ pour mesure_tribunal_ouvert !!!!! §§§§§§§§)
    // de la table mesure + leurs données liées et doublonnées dans la tabe tiers
    $q = "SELECT mesure_tribunal_ouvert, tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3";
    $q .= " FROM mesure JOIN tiers ON(mesure_tribunal_ouvert = `tiers_id`)";
    $r = mysql_query($q) or die(mysql_error()."<br />".$q);
    //pour chaque ligne trouver j'affiche la requete update adéquate 
    //(qui update le champcouranr du meilleur tiers_id possible)
    while($d = mysql_fetch_assoc($r))
    {
    	echo "UPDATE mesure SET mesure_tribunal_ouvert=(SELECT MIN(`tiers_id`) FROM tiers";
    	echo " WHERE tiers_type_id='".$d["tiers_type_id"]."' AND tiers_nom='".addslashes($d["tiers_type_id"])."'";
    	echo " AND tiers_adr1='".addslashes($d["tiers_adr"])."' AND tiers_adr2='".addslashes($d["tiers_adr"])."'";
    	echo " AND tiers_adr3='".addslashes($d["tiers_adr"])."')<br />\n";
    }
    ?>
    Bref je me basais sur le message de ce matin sans savoir en quoi et a quel niveau intervenait la notion de dossier.

    Pour résumer ce code récupère tous les "mesure_tribunal_ouvert" + les valeurs auxquelles il se réfèrent d'en tiers => ça c'est le boulot de $q.

    Et après ma boucle while crée des requete UPDATE qui cheche le bon ID pour ces mêmes valeurs afin de réaffecter mesure_tribunal_ouvert.

    Donc si tu englobe le tout dans un autre while (qui du peu que je comprenne ne sert pas) ca devient monstrueux car je lis moi même la table mesure. c'est $q qui lit déjà la table mesure_maj si tu préfère, mais elle ne prends a chaque fois que ce dont elle a besoin cad dire la valeur du champs mesure_tribunal_ouvert et les valeurs correspondantes dans tiers.

    Ce que je te conseille c'est de reprendre mon premier script, j'ai corrigé mesure => maj_mesure :-) et de le lancer comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    <?php
    //je crée un tableau des3 champs liees de la table maj_mesure a passer en revue et updater
    $champs_lies = array("`mesure_tribunal_ouvert`", "`mesure_tribunal_design`" , "`mesure_tribunal_atmp`");
    //j'engage une boucle pour faire toute l'action  ci-dessous successivement sur pour chacun des 3 champs
    foreach($champs_lies as $champ)
    {
    	//recupere tous les féréence a tiers dans maj_mesure (pour le nom de champ courant)
    	// de la table maj_mesure + leurs données liées et doublonnées dans la tabe tiers
    	$q = "SELECT ".$champ.", tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3";
    	$q .= " FROM maj_mesure JOIN tiers ON(".$champ." = `tiers_id`)";
    	$r = mysql_query($q) or die(mysql_error()."<br />".$q);
    	//pour chaque ligne trouver j'affiche la requete update adéquate 
    	//(qui update le champcouranr du meilleur tiers_id possible)
    	while($d = mysql_fetch_assoc($r))
    	{
    		echo "UPDATE maj_mesure SET ".$champ."=(SELECT MIN(`tiers_id`) FROM tiers";
    		echo " WHERE tiers_type_id='".$d["tiers_type_id"]."' AND tiers_nom='".addslashes($d["tiers_type_id"])."'";
    		echo " AND tiers_adr1='".addslashes($d["tiers_adr"])."' AND tiers_adr2='".addslashes($d["tiers_adr"])."'";
    		echo " AND tiers_adr3='".addslashes($d["tiers_adr"])."')<br />\n";
    	}
    }
    ?>
    Je répète, $q lis déjà ce dont j'ai besoin dans maj_mesure !
    il n'y a pas de sotte existence

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Si t'es pas sur de ma démarche tu n'as qu'a m'envoyer les dump des 2 tables.

    je fais l'update en local et je te renvoie des dump tout propres, corrigés et dédoublonnés.
    il n'y a pas de sotte existence

  4. #24
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Tel quel avec juste un ajout à la fin pour le mysql_query

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    mysql_connect("localhost", "root", "");
    mysql_select_db("doublons");
    //je crée un tableau des3 champs liees de la table maj_mesure a passer en revue et updater
    $champs_lies = array("`mesure_tribunal_ouvert`", "`mesure_tribunal_design`" , "`mesure_tribunal_atmp`");
    //j'engage une boucle pour faire toute l'action  ci-dessous successivement sur pour chacun des 3 champs
    foreach($champs_lies as $champ)
    {
    	//recupere tous les féréence a tiers dans maj_mesure (pour le nom de champ courant)
    	// de la table maj_mesure + leurs données liées et doublonnées dans la tabe tiers
    	$q = "SELECT ".$champ.", tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3";
    	$q .= " FROM maj_mesure JOIN t_tiers ON(".$champ." = `tiers_id`)";
    	$r = mysql_query($q) or die(mysql_error()."<br />".$q);
    	//pour chaque ligne trouver j'affiche la requete update adéquate 
    	//(qui update le champcouranr du meilleur tiers_id possible)
    	while($d = mysql_fetch_assoc($r))
    	{
    		$sql="UPDATE maj_mesure 
    				  SET $champ=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."')";
     
    		$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    	}
    }
    ?>
    J'ai les sauvegardes pas de problème.

    Il boucle en changeant à chaque fois par le même n° à chacun des enregistrements. Donc toutes les mesures se retrouvent avec le même n°.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    oui oui scuze, je t'explique pourquoi ;

    en fait il me manque la clause where qui garde l'identification de la ligne courante a savoir que $q aurait du remonter aussi id_mesure que j'aurais du apres répercuté entant que clause where des update .

    c'est con j'avais élaboré la requete mais oublié de te faire çà dans le script, ch'ui teubé moi des fois tsssss.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <?php
    mysql_connect("localhost", "root", "");
    mysql_select_db("doublons");
    //je crée un tableau des3 champs liees de la table maj_mesure a passer en revue et updater
    $champs_lies = array("`mesure_tribunal_ouvert`", "`mesure_tribunal_design`" , "`mesure_tribunal_atmp`");
    //j'engage une boucle pour faire toute l'action  ci-dessous successivement sur pour chacun des 3 champs
    foreach($champs_lies as $champ)
    {
    	//recupere tous les féréence a tiers dans maj_mesure (pour le nom de champ courant)
    	// de la table maj_mesure + leurs données liées et doublonnées dans la tabe tiers
    	$q = "SELECT id_mesure, ".$champ.", tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3";
    	$q .= " FROM maj_mesure JOIN t_tiers ON(".$champ." = `tiers_id`)";
    	$r = mysql_query($q) or die(mysql_error()."<br />".$q);
    	//pour chaque ligne trouver j'affiche la requete update adéquate 
    	//(qui update le champcouranr du meilleur tiers_id possible)
    	while($d = mysql_fetch_assoc($r))
    	{
    		$sql="UPDATE maj_mesure 
    				  SET $champ=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."')
    			 	  WHERE id_mesure=".$d["id_mesure"].";";
    		echo $sql."<br />\n";
    		//$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    	}
    }
    ?>
    cette fois je fais remonter l'id_mesure au niveau de $q, pour que dans la boucle while on sache bien de quelle entrée de la table maj_mesure on parle.

    ensuite je l'identifie clairement dans la clause where de l'UPDATE.

    tu devrais réessayer ce nouveau script en laissant le echo() et en laissant commenté le mysql_query().
    comme ca tu regarde la gueule des requetes avant, car en cas de pb c'est peut etre chiant de regénérer a chaque fois la table non?
    il n'y a pas de sotte existence

  6. #26
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Bonjour Monsieur Gisèle,

    Je suis ton raisonnement, mais il manque quelques choses que tu vas comprendre avec les 2 dump que je te mets.

    Voici les données pour les mesures


    Voici les données pour les tiers


    Tu remarqueras que pour le tiers id_maj=98 les adresses suivantes sont identiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12016 - 10623 - 12323 - 12463 - 12465
    Donc on voit bien qu'il ne suffit pas de traiter les mesures lignes par lignes, mais qu'en fait, il faut les traiter dans leur globalité pour un même majeur.

    Donc dans les enregistrements des mesures correspondantes id_maj=98 je devrais avoir


    Intéressant comme complication
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Salut Pierre,

    Ben je ne saisis que vaguement car les liens n'apparaissent pas :-) sauf la structure des tables en pièce jointe qui sommes toute est conforme au modèle que je t’ai monté plus haut.

    Je pense comprendre que finalement l’ « id_maj » rassemble les enregistrements de mesure_maj pour un même dossier c’est ça ?

    Je ne sais pas si pas si tu veux dire que pour un même id_maj les références à tiers sont sensées être toutes les mêmes.
    Ou en tout pour le moment je vois mal la nuance de devoir traiter mesure_maj par bloc du même id_maj plutôt que ligne par ligne puisque à l‘arrivée elles seront toutes checkées, quitte a faire intervenir cet id_maj dans mon approche atomique si besoin était.

    Ce que j’essaie de dire, c’est que même avec une approche ligne par ligne il n’y a pas raison que des 5 (12016 - 10623 - 12323 - 12463 – 12465) ne se retrouve pas mécaniquement avec les même adresses.

    Mais peut être saisirai-je mieux l’exigence en voyant les dumps.


    Je suis sur qu'une fois le truc saisi, il restera pas grand chose a faire pour le faire tourner ce bouzin!
    il n'y a pas de sotte existence

  8. #28
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Je te mets les images en documents joints.

    Pour les dumps de la base comment je te les transmets, j'ai fait un extrait mais il ne passe pas par le forum en pièces jointes trop volumineux.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Je crois que j'ai compris, pour le moment, voila ce qui se passe pour les id_mesure 98 et 1549 qui ont le même id_maj=98
    $q récupère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id_mesure =>98, 
    mesure_tribunal ouvert =>12016
    tiers_type_id = 60 tiers_nom = 'Tribunal d'instance de Bourg en Bresse', tiers_adr1 ='', tiers_adr2='', tiers_adr3=''
     
    id_mesure =>1549, 
    mesure_tribunal ouvert =>10623
    tiers_type_id = 60 tiers_nom = 'Tribunal d'instance de Bourg en Bresse', tiers_adr1 ='', tiers_adr2='', tiers_adr3=''
    les updates seront trouveront le plus petit id_tiers commun 12453 (si y en a pas d'autre avant l'extrait mais admetons que ce soit celui la :

    pour id_mesure = 98 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE maj_mesure 
    SET $champ=(SELECT MIN(`tiers_id`) 
    FROM t_tiers
    WHERE tiers_type_id='60'
    AND tiers_nom='Tribunal d'instance de Bourg en Bresse'
    AND tiers_adr1=''
    AND tiers_adr2=''
    AND tiers_adr3='')
    WHERE id_mesure=98;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE maj_mesure 
    SET $champ=(SELECT MIN(`tiers_id`) 
    FROM t_tiers
    WHERE tiers_type_id='60'
    AND tiers_nom='Tribunal d'instance de Bourg en Bresse'
    AND tiers_adr1=''
    AND tiers_adr2=''
    AND tiers_adr3='')
    WHERE id_mesure=1549;
    d'ou le nouveau une fois l'opération effectuée pour les 2 entrés de maj_mesure :
    mesure_tribunal ouvert = 12453(en supposant que ce tiers était bien le plus petit tiers_id pour ces mêmes adresses).

    A l'arrivée de mon approche ligne par ligne, toutes lignes de maj_mesure linkée avec de même adresses en dépit du fait qu'elles est aient au départ un id_tiers différents,
    ce retouveront avec le même id_tiers, le plus plus id_tiers correspondant a ces adresses.


    Mais d'apres ta capture du résultat escompté , il fallaient peut être chercher le plus petit id_tiers mais pour le même adresses mais aussi pour POUR UN MEME ID_MAJ.

    auquel cas tu fait également remonter dans $q l'id_maj :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //recupere tous les féréence a tiers dans maj_mesure (pour le nom de champ courant)
    	// de la table maj_mesure + leurs données liées et doublonnées dans la tabe tiers
    	$q = "SELECT id_mesure, id_maj, ".$champ.", tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3";
    	$q .= " FROM maj_mesure JOIN t_tiers ON(".$champ." = `tiers_id`)";
    	$r = mysql_query($q) or die(mysql_error()."<br />".$q);
    et apres tu transforme la requete des updates comme suit( je fait une jointure pour pouvoir mettre en condition l'id_maj) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    while($d = mysql_fetch_assoc($r))
    	{
    		$sql="UPDATE maj_mesure 
    				  SET ".$champ."=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers JOIN (maj_mesure) ON(id_tiers=".$champ.")
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."')
    			 	  WHERE id_mesure=".$d["id_mesure"]." AND id_maj=".$d["id_maj"].";";
    		echo $sql."<br />\n";
    		//$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    	}
    et la je récupère non pas 12453 mais bien 10623 conformément a ta dernière capture, cad le plus petit id_tiers référencé par l'une des entrée qui ont pour id_maj 98!

    donc

    mesure_tribunal ouvert = 10623

    en sachant que le foreach ce chargera de répéter l'opération pour le calcul du champ mesure_tribunal_design et mesure tribunal_atmp.

    J'ai bon?
    il n'y a pas de sotte existence

  10. #30
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    attention, ma clause where est mal placée !
    c'est dans la requete imbriquée qu'il faut la mettre afin de faire remonter a la requete principale le bon id_tiers!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    while($d = mysql_fetch_assoc($r))
    	{
    		$sql="UPDATE maj_mesure 
    				  SET ".$champ."=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers JOIN (maj_mesure) ON(id_tiers=".$champ.")
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."'
    					AND id_maj=".$d["id_maj"].")
    			 	  WHERE id_mesure=".$d["id_mesure"].";";
    		echo $sql."<br />\n";
    		//$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    	}
    il n'y a pas de sotte existence

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Euh je pards a la mer pour la journée alors t'étonne pas si je ne suis pas tres réactif :-)
    il n'y a pas de sotte existence

  12. #32
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Bonne mer, y a du soleil où ????
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    Bah je suis Aixois, et là je pars à Cassis...
    il n'y a pas de sotte existence

  14. #34
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    You can't specify target table 'maj_mesure' for update in FROM clause

    Cela te dit quelque chose ?
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  15. #35
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Cassis, veinard.

    no commet, c'est génial, enfin toute les callanques etc...

    J'ai retiré le join et le résultat est le même semble-t-il.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  16. #36
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    quel joint a retirer?

    au contraire, il fallait en ajouter un dans la reaquete imbriquée + une clause where qui réduit la recherche des id_tiers a ceux qui sont référencée par un même id_maj.

    comme le tout dernier script que j'ai mis en fait.

    donc étape 1, rajouter id_ma dans $q pour faire remoner cette info.

    etatpe 2, faire matcher cette info dans la sousrequete .
    Ce qui fait que pour le cas 98, c'est 10623 qui est remonté au lieu de 12016.

    Je te copie ma derniere version de code :

    voici $q :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //recupere tous les féréence a tiers dans maj_mesure (pour le nom de champ courant)
    	// de la table maj_mesure + leurs données liées et doublonnées dans la tabe tiers
    	$q = "SELECT id_mesure, id_maj, ".$champ.", tiers_type_id, tiers_nom, tiers_adr1, tiers_adr2, tiers_adr3";
    	$q .= " FROM maj_mesure JOIN t_tiers ON(".$champ." = `tiers_id`)";
    	$r = mysql_query($q) or die(mysql_error()."<br />".$q);
    et les requete update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    while($d = mysql_fetch_assoc($r))
    	{
    		$sql="UPDATE maj_mesure 
    				  SET ".$champ."=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers JOIN (maj_mesure) ON(id_tiers=".$champ.")
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."'
    					AND id_maj=".$d["id_maj"].")
    			 	  WHERE id_mesure=".$d["id_mesure"].";";
    		echo $sql."<br />\n";
    		//$result = mysql_query($sql) or die(mysql_error()."<br />".$sql);
    	}

    Il y a bien une jointure dans la requete imbriquée
    il n'y a pas de sotte existence

  17. #37
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Pourquoi cette erreur à l'exécution sur l"update alors ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE maj_mesure SET `mesure_tribunal_ouvert`=(SELECT MIN(`tiers_id`) FROM t_tiers JOIN (maj_mesure) ON(id_tiers=`mesure_tribunal_ouvert`) WHERE tiers_type_id='60' AND tiers_nom='Tribunal d\'Instance de Lyon 2' AND tiers_adr1='Service des Tutelles' AND tiers_adr2='67 rue Servient' AND tiers_adr3='' AND t_tiers.id_maj=1) AND id_mesure='1'You can't specify target table 'maj_mesure' for update in FROM clause
    Code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $sql="UPDATE maj_mesure 
    				  SET $champ=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers JOIN (maj_mesure) ON(id_tiers=".$champ.")
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."'
    					AND t_tiers.id_maj=".$d["id_maj"].")
    			 	  AND id_mesure='".$d["id_mesure"]."'";
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  18. #38
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    pourquoi as tu préfixé t-tiers.id_maj dans la clause where de la requete imbriquée?

    je ne crois pas me souvenir que t_tiers ait un champ nommé id_maj.

    de plus il se peutq ue comme normalement tous les SGBDR, ou ne peut pas selecter une table tout en l'updatant, ca vaut pour le procédural (pl/SQL) et ca vaut je pense aussi pour le requete.

    peut etre, sans rien promettre devrait tu essayer de distinguer en a et b comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sql="UPDATE maj_mesure a 
    				  SET $champ=(SELECT MIN(`tiers_id`) 
    				  FROM t_tiers JOIN maj_mesure b ON(id_tiers=b.".$champ.")
    			  	  WHERE tiers_type_id='".$d["tiers_type_id"]."'
    			  	  AND tiers_nom='".addslashes($d["tiers_nom"])."'
    			  	  AND tiers_adr1='".addslashes($d["tiers_adr1"])."'
    			 	  AND tiers_adr2='".addslashes($d["tiers_adr2"])."'
    			 	  AND tiers_adr3='".addslashes($d["tiers_adr3"])."'
    					AND b.id_maj=".$d["id_maj"].")
    			 	  AND a.id_mesure='".$d["id_mesure"]."'";
    il n'y a pas de sotte existence

  19. #39
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 102
    Points : 120
    Points
    120
    Par défaut
    OK je vais y a ller si ca fait la même erreur( probleme de target table pour l'update), je te trouve ce soir une variation de cette solution qui évite de devoir retourner chercher l'info sur maj_mesure a l'intérieur de la requete update.
    (je crois que le message d'erreur vient de la, tentative d'acces en select sur une table que l'on est en train d'updater)
    Sauf si tu as trouvé ton bonheur entre temps bien sur.
    il n'y a pas de sotte existence

  20. #40
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Dans le message 15 j'ai mis qu'il avait un id_maj dans la table tiers
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/08/2006, 21h46
  2. Réponses: 4
    Dernier message: 02/05/2006, 12h08
  3. Réponses: 4
    Dernier message: 10/03/2005, 14h10
  4. Quelle est la fiabilité du protocole SSL ?
    Par Anonymous dans le forum Développement
    Réponses: 5
    Dernier message: 05/09/2002, 13h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo