Doublons et attribut par defaut [Résolu]

Signaler
Messages postés
11
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
23 janvier 2007
-
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
-
Bonjour, un petit probleme

J'ai une table avec quatre champs (id,date1,date2,date3) j'enregistre mes date dans mysql au format date 0000-00-00

j'aimerai que ma requete retourne toute les  dates des champs date1,date2 et date3 sans doublons et sans les attributs par defaut(0000-00-00)

je fais ceci mais ça ne marche pas, ça m'affiche tj les doublons et les attributs par defaut dans une liste déroulante :

$req1 = mysql_query("select * from voyage where voyage.id GROUP BY date1,date2,date3,date4,date5,date6");




    
   
 while($ligne = mysql_fetch_array($req1))
   {
    $id = $ligne ["id"];
   $d1 = $ligne ["date1"];
   $d2 = $ligne ["date2"];
    $d3 = $ligne ["date3"];
     $d4 = $ligne ["date4"];
   $d5 = $ligne ["date5"];
    $d6 = $ligne ["date6"];

Merci beaucoup

16 réponses

Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
Mais tu peux faire autant de requète que tu veux dans une même page !!!

Si tu veux faire 10 SELECT, 3 INSERT, 6 UPDATE et 40 DELETE, tu peux le faire !
Y'a aucune restriction !!

Ce que tu vas faire :
 --> première query, tu insère ton nouveau voyage dans ta table "voyage".
 ----> tu récupères le numéro d'ID du voyage (via mysql_insert_id())
--> tu fais ta deuxième query, tu fais autant d'insertion que tu possèdes de date dans ta table "date_par_voyage".

Je pensais pas que faire de l'insertion de donnée était si compliqué ;)
Messages postés
85
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
14 mars 2007
1
bonjour,
je te propose d'aller faire un tour de ce coté :
http://sqlpro.developpez.com/cours/doublons/
cordialement
Messages postés
11
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
23 janvier 2007

Merci pour ta réponse j'ai essayé ce qu'ils proposaient sur le site mais rien ne me semble convenir...

je me suis peut-etre mal expiqué, ce que j'aimerai ce n'est pas de supprimer les doublons dans ma base mais de ne pas les afficher dans le while.

sur mon site j'ai une liste déroulante qui me donne toute les dates enregistré dans date1,date2,date3 et date4 mais celle-ci m'affiche des doublons par ex si 2007-01-01 est dans date1 et date2 il me l'affiche deux fois dans cette liste mais aussi les attributs par défaut çàd que si il n'y a pas d'enregistrement la date est par défaut 0000-00-00 et il me l'affiche aussi.
Messages postés
85
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
14 mars 2007
1
essaye la clause HAVING après le GROUP BY
Messages postés
85
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
14 mars 2007
1
re,


pour les doublons utilise la clause "distinct" ou "distinctrow" avant le champ
Messages postés
11
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
23 janvier 2007

HAVING ne me sert pas à grand chose, je ne veux pas faire un calcule sur mes dates, je veux juste que les doublons et les attributs par défaut des champs DATE ne (s'affiche pas) merci quand meme.

J'ai essayé DISCTINCT mais ça ne marche que pour un seul champ pas plusieurs.
Messages postés
85
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
14 mars 2007
1
re et der je pense,

$n = 1; //initialisation de l'incrément

 while($ligne = mysql_fetch_array($req1))
   {
      if($ligne ["date.$n"] != "0000-00-00" && $n < 7)
         {
            $id = $ligne ["id"];
            $d.$n = $ligne ["date.$n"];
         }
   $n++;
   }
puis après dans une boucle tu affiches $d.$n si il existe.
je pense que celà résoudra ton problème
Messages postés
85
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
14 mars 2007
1
pardon encore moi
pour éliminer les doublons avant la date par défaut je pense qu'il faut rédiger ta requète ainsi :
$req1 = mysql_query("select date1,date2,date3,date4,date5,date6 from voyage where voyage.id GROUP BY date1,date2,date3,date4,date5,date6");
Messages postés
85
Date d'inscription
lundi 14 juillet 2003
Statut
Membre
Dernière intervention
14 mars 2007
1
et re


et pour les doublons en php il existe cette fonction : "array_unique", donc la fonction de tri avec suppression de la valeur par défaut devient :


$n = 1; //initialisation de l'incrément
$ligne = mysql_fetch_array($req1);
$neue_ligne = array_unique($ligne);//array_unique retourne un tableau sans les doublons

 while(!empty($neue_ligne))
   {
      if($ligne ["date.$n"] != "0000-00-00" && $n < 7)
         {
            $id = $ligne ["id"];
            $d.$n = $ligne ["date.$n"];
         }
   $n++;
   }
Messages postés
11
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
23 janvier 2007

re ton code me réenvoit tous les champs dates avec doublons, attributs par defaut et l'infini, j'ai fait sauté les memory_limit et max_execution_time de mon hébergeur 
Messages postés
11
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
23 janvier 2007

je deviens fou ça fait 2 jours que je suis là dessus, je suis sur que c'est un truc simple mais je passe à coté de la plaque, je veux juste  mettre toute les valeurs de 6 champs et les afficher dans une liste déroulante sans doublons et sans les attributs par défaut(0000-00-00), Help plz
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
$req1 = mysql_query("select * from voyage where voyage.id GROUP BY date1,date2,date3,date4,date5,date6");

Mauvaise conception de ta base de donnée à l'origine.
Voila pourquoi tu possèdes ce problème.

Dans une base de donnée, tu as des champs "dateN" (soit date1, date2, date3.... date6).
Hors, tu ne peux pas faire un truc comme ca. C'est abérant de voir un truc pareil, tu aurais 20 dates, tu marques les 20 dates dans des champs ?
Non, il faut revoir ta base de donnée.

table voyage :
id INT(11) NOT NULL AUTOINCREMENT
autrechamp VARCHAR(255)
// etc...

table date_de_voyage :
id INT(11) NOT NULL AUTOINCREMENT
id_voyage INT(11) NOT NULL
date DATETIME()

Avec une contrainte entre date_de_voyage.id_voyage et voyage.id

Après, et seulement après tu fais ta requète avec une jointure en utilisant un DISTINCT. Tu vas voir comme par magie que ca fonctionne comme tu le souhaites.

Tu as fait une mauvaise analyse de ta BDD dès le début, normal que tu te prennes la tête pour rien.
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
J'ai oublié un exemple de ta table date_de_voyage

id | id_voyage | date
1 |    10          | dd:mm:yyyy h:i:s
2 |    10          | dd:mm:yyyy h:i:s
3 |    11          | dd:mm:yyyy h:i:s

etc...

Tu vas me dire que tu n'as besoin que de 6 dates... à toi de t'arranger avec PHP pour éviter de pouvoir rajouter une 7ème date.

Je te laisse le soin de la requète avec la jointure :)
Messages postés
65
Date d'inscription
mardi 2 mars 2004
Statut
Membre
Dernière intervention
7 février 2007

encore merci pour ta patience, je susi autodidact en progammation et cela fait longtemps que je n'ai plus fait de php.

J'ai bien pensé à ce que tu me propose mais si je refais une table date_de_voyage avec les dates lié par la contrainte date_de_voyage.id_voyage et voyage.id je n'arriverai pas à faire l'enregistrement ou l'update dasn ma partie administration.

je m'explique c'est un site de proposant des voyages et certain voayages ont plus d'une date de départ ( une , deux ou plus max 6)  j'ai une page dans ma partie admin pour ajouter des voyages avec 6 listes déroulante pour les dates et une autre page pour l'update avec les 6 listes déroulante.

donc si je n'ai qu'une seule page pour l'ajout de nouveaux voyages je ne vois pas comment voyage.id et date_de_voyage.id_voyage  pourraient avoir la meme valeur. c'est pour ça que j'ai été contrain de faire comme ça, en fait il faudrait d'abort que j'enregistre dans ma table voyage et seulement après enregistrer dans date_de_voyage mais le prob c'est que je dois tout faire sur la meme page d'ajout.

Merci
  
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
"je n'arriverai pas à faire l'enregistrement ou l'update dasn ma partie administration." ? pourquoi ?
Moi j'y arrive très bien pourtant :o

"je ne vois pas comment voyage.id et date_de_voyage.id_voyage  pourraient avoir la meme valeur." C'est la meme chose. C'est ce qui va lier tes dates à tes numéros de voyages !

"en fait il faudrait d'abort que j'enregistre dans ma table voyage et
seulement après enregistrer dans date_de_voyage mais le prob c'est que
je dois tout faire sur la meme page d'ajout." Si tu fais 2 requètes, ta première sera sur la table voyage, et la seconde sur tes table de date.
En réalité, tu vas faire autant d'insert que de date pour ton voyage.

C'est simple :)
Messages postés
65
Date d'inscription
mardi 2 mars 2004
Statut
Membre
Dernière intervention
7 février 2007

j'abuse je sais

mais le prob c'est que je ne saurai pas faire d'insert sur les deux table d'un coup en une seule page puis qu'il faut d'abort que voyage.id s'incrémente et ensuite sur une deuxieme page en récupérant la valeur de la clé primaire voyage.id pour l'inserer dans date_de_voyage.id_voyage et la la liaison sera faite, je me trompe ou je dois bien faire comme ça? çàd deux pages