Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2011, 14h43   #1
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 183
Points : 33
Points : 33
Par défaut Copier une table après un select distinct

Bonjour à tous,

Je suis coincé et j'ai beau regarder, il me semble que mon script est bon mais manifestement pas... J'ai une erreur mysql_fetch_assoc...

Je vous explique. J'ai une table1 dans une bdd1 qui est en vrac. Je veux enlever les doublons et la copier, champ par champ, dans une table2 de la bdd2.
Mon script :


Code :
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
 
 require ("fonctions.php");   // les fonctions personnelles
 require ("conf.pfp");    // définition des bdd
 
 GetMyConnection1();    //fonction de connection et contrôle pour la bdd1
  $tables = mysql_list_tables($bdd1);
 
  GetMyConnection2();    //fonction de connection et contrôle pour la bdd2
 
  while ($line = mysql_fetch_row($tables)) {
 
       $table1 = trim($line[0]);   // nom des tables bdd1. Ce seront les mêmes dans la bdd2
       $table2 = $table1;   
 
                 // tri de la table sur la 'ville'
          // les champs de la table sont id, pays, region, departement, ville, lat, long, et zipCode
       // ici j'utilise le DISTINCT mais je le maîtrise mal...
 
       $sql = "SELECT DISTINCT * FROM $table1 GROUP BY `ville`";
       $rep = mysql_query($sql);
 
       if (!$rep) {
           echo "Erreur DB, impossible de trier la table <BR>";
           echo 'Erreur MySQL : ' . mysql_error()."<BR><BR>";
       }  else {
 
           if ($num_rows = mysql_num_rows($rep) > 0) {
 
               while ($donnees = mysql_fetch_assoc($rep)) {
 
                   $pays = "";
                   $region = "";
                   $departement = "";
                   $ville = "";
                   $lat = "";
                   $long = "";
                   $zipCode = "";
 
            // ici, dans la table1, le code est global et je le divise pour obtenir le pays et la région
 
                   $code = trim($donnees["code"]);
                   $taille = strlen($code);
                   $pays = left($code, 2);
                   $region = right($code, $taille - 2);
                   $departement = trim($donnees["departement"]);
                   $ville = trim($donnees["ville"]);
                   $lat = trim($donnees["lat"]);
                   $long = trim($donnees["long"]);
                   $zipCode = trim($donnees["zipCode"]);
 
                   $sql = "INSERT INTO $bdd2.$table2
                   VALUES ('', '$pays', '$region', '$departement', '$ville', '$lat', '$long', '$zipCode')";
                   $rep = mysql_query($sql);
 
                   if (!$rep) {
                       echo "Erreur DB, impossible d'enregistrer la table <BR>";
                       echo 'Erreur MySQL : ' . mysql_error()."<BR><BR>";
                   }
               }
           }
       }
  }
Si vous pouviez m'aider, merci d'avance.
Whombat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 15h08   #2
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
Dans ton code a la ligne 49
Code :
$sql = "INSERT INTO $bdd1.$tabl
les variable $bdd1 et $tabl ne sont pas definit, en tous cas pas dans la partie de code que tu a mis ici.
Tu nous dit pas ou exactement l'erreur se produit. Fait des essais de ta requette SQL dans PHPMyAdmin par exemple. Je pense que tu pourra faire le meme boulot juste avec des requettes SQL imbriquées.
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 15h18   #3
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 183
Points : 33
Points : 33
Merci de votre réponse.

Oups! j'ai oublié de dire 2 choses : les bdd sont définies en début de scriopt dans un fichier conf.php

La bdd1, sur le script s'appelle en fait bdd et la bdd2, bdd1. Je les ai appelées bdd1 et bdd2 sur le message pour une meilleure compréhension. J'aurais dû changer aussi le script. Mes excuses, vous avez raison.

Je vais le refaire.
Whombat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 15h28   #4
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
Quelle est la difference entre Id et Code???
Dans ton commentaire tu dit tri de la table mais tu fait un group by dans ta requette SQL??
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 15h35   #5
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 183
Points : 33
Points : 33
Oui, et c'est peut-être là que ça coince.

En fait je voudrais que toute ma base soit la même 'à l'exclusion' des doublons. J'ai donc essayé SELECT DISTINCT `ville` FROM mais il ne me donne que les ville, bien sûr. Je veux qu'il me trie toute la base, sur la ville pour les doublons, mais qu'il me donne la rangée complête. Cad :

id, code, departement, ville, lat, long, zipCode.

L'id n'est pas indispensable puisqu'auto-incrément et dans la nouvelle base il se creera au fur et à me
sure.
Whombat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h27   #6
Membre confirmé
 
Homme
Développeur informatique
Inscription : avril 2011
Messages : 196
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Italie

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : avril 2011
Messages : 196
Points : 298
Points : 298
Sinon tu pourrai faire comme cela pour eliminer les doublons et les inserer dans une nouvelle table
Code :
1
2
CREATE TABLE nouvelle_table as
SELECT * FROM ancienne_table GROUP BY ville;
ou bien
Code :
1
2
INSERT INTO nouvelle_table(pays, region, departement, ville, lat, long, zipCode) 
VALUES SELECT pays, region, departement, ville, lat, long, zipCode FROM ancienne_table GROUP BY ville;
ou bien travailler sur l'index
Code :
ALTER IGNORE TABLE ancienne_table ADD UNIQUE INDEX(ville);
fab256 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 16h43   #7
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 183
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 183
Points : 33
Points : 33
Ca a l'air de fonctionner. Je ne peux pas contrôler tout de suite mais j'ai perdu environ 10% de mes enregistrements ce qui me parait raisonnable.

En effet, chaque ville est notée en fonction de son code postal et de nombreuses (très nombreuses) villes ont plusieurs codes pour le même nom...

Mais alors, je suis épaté par mon ignorance. Comment se fait-il que le GROUP BY suffise sans passer par un DISTINCT ?

En 2 lignes, vous avez réglé un script de 40... C'est pas mal. Merci encore.
Whombat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h38.


 
 
 
 
Partenaires

Hébergement Web