Votre question

Boucles: sauter les doublons

Tags :
  • MySQL
  • Programmation
Dernière réponse : dans Programmation
12 Février 2009 18:29:58

Bonjour,

J'ai un code qui me permet d'afficher via ma base de donne la liste de catégories:

J'obtiens donc :

Catégorie principale
Sous catégorie1

Catégorie principale
Sous catégorie2

Catégorie principale2
Sous catégorie11

....

Je voudrai avoir :

Catégorie principale
Sous catégorie1
Sous catégorie2
Sous catégorie3

Catégorie principale2
Sous catégorie11
Sous catégorie22
Sous catégorie33


voila mon code

Citation :

$reponse = mysql_query("SELECT DISTINCT Category FROM products ORDER BY Category ASC");

while ($donnees = mysql_fetch_array($reponse) )
{

list($main, $sous) = split('[>]', $donnees['Category']);

echo "$main";
echo "<br>";
echo "$sous";
echo "<br><br>";

}



$main sont les catégories principales et $sous les sous catégories

Merci de votre aide

Autres pages sur : boucles sauter doublons

13 Février 2009 14:14:43

Salut,

pourquoi tes sous-catégories ne sont pas dans une table différente que les catégories principales ?
13 Février 2009 17:21:50

Jointure / sous requete.
13 Février 2009 18:38:23

Sur ma base de donne j'ai un champ : Catégorie qui contient les catégories sous la forme de : Catégorie pricipale1 > sous catégorie 1
Catégorie pricipale1 > sous catégorie 2
....
c'est pour cela que j'utilise la fonction list pour séparer les mots et les stoquer dans des variables($main, $sous)

Okinou peut-tu être plus précis.

Merci
13 Février 2009 19:55:38

donc si j'ai bien compris, tes enregistrements dans ta bdd sont sous cette formes :

Catégorie

Catégorie 1 > sous catégorie 1
Catégorie 1 > sous catégorie 2
Catégorie 2 > sous catégorie 1
Catégorie 2 > sous catégorie 2

Je trouve que c'est un erreur de conception. Tu vois d'ailleurs bien que tu as informations redondantes.

Tu ferais mieux de modifier la structure de ta bdd avec une table catégorie_principale et une autre table catégorie_secondaire. Une catégorie principale peut avoir plusieurs catégories secondaires. Une catégorie secondaire peut, en fonction de ton point de vue, être dans une seule catégorie principale (donc tu ajoutes un champ pour l'identifiant de chaque catégorie principale dans la table catégorie_secondaire) ou une sous catégorie peut être dans plusieurs catégories principales et dans ce cas, il te faut une table intermédiaire qui va contenir l'identifiants d'une catégorie principale et l'identifiant d'une catégorie secondaire, ceci pour chaque lien entre une catégorie principale et une secondaire.

C'est là qu'interviennent les jointures dont parle Okinou.

Si t'as rien compris, va apprendre les bases de la conception correcte d'une base de données.
13 Février 2009 20:16:20

Je comprend seulement ma base de donnée est mise à jour tout les jours par un flux externe fournis par un autre site.
Y a-t-il un moyen de récupérer la valeur d'une variable dans la boucle précédente?
De cette façon je pourrai faire une fonction IF pour tester si la valeur de cette variable($main) est la même dans la boucle actuelle que dans la boucles précédente.
Ce qui me permettrais de ne pas afficher la variable $main si celle si est identique à la précédente.


Edit: il n'y a pas d'informations redondantes.

Chaque sous catégorie est unique! il n'y a que les Catégories principale qui se répètent(dans la limite de leurs sous catégories).
13 Février 2009 20:46:11

Ben d'abord tu fais une première requète sql qui va récupérer toutes les catégories principales. Tu fais une boucle pour parcourir chaque catégorie trouvée et pour chacune, tu fais une seconde requète sql qui va aller chercher les sous catégories de cette catégorie principale.
13 Février 2009 20:53:20

Oui ça semble être la bonne solution mais pour faire cela il faudrai que les categories principales soient séparer des sous catégories(je rappel que sur la base de donne elle sont sous la forme de : Catégories Principales > Sous catégorie)

Donc il faudrai appliquer la fonction :

list($main, $sous) = split('[>]', $donnees['Category']);

et cela avant d'envoyer les 2 requêtes.
13 Février 2009 22:18:38

oué mais là dans ta boucle tu vas devoir stoker la catégorie principale en cours pour devoir à chaque fois la comparer avec la suivante :/ 
t'as fais une erreur de conception dans ta bdd donc soit maintenant tu modifie la structure de ta bdd soit tu gères à l'arrache comme là
13 Février 2009 22:46:37

oki je vais voir ce que je peut faire,

merci
13 Février 2009 23:35:05

hiola a dit :
oué mais là dans ta boucle tu vas devoir stoker la catégorie principale en cours pour devoir à chaque fois la comparer avec la suivante :/ 
t'as fais une erreur de conception dans ta bdd donc soit maintenant tu modifie la structure de ta bdd soit tu gères à l'arrache comme là


On le rappellera jamais assez, la base de donnée c'est le coeur d'une application, il faut toujours bien la pensé. Là tu fais une grosse erreur de conception ... La solution à l'arrache est en effet pas mauvaise, et tu as au passage des performances corrects.

Normalement tu ne devrais même pas avoir de DISTINCT car les catégories devraient être dans une table différente de product. Là tu as une redondance terrible ! Les SGBD sont justement là pour éviter ce genre de chose.
14 Février 2009 10:56:39

mon problème c'est que ma base de donne est mise à jour tout les jours grace à des flux CSV.

En voici un aperçu:

la première ligne:

Citation :
"rubrique";"nom"


la deuxième ligne:

Citation :
"Jeu > Jeux vidéo";"DRIVING EMOTION"


Donc j'ai un script qui permet de parser ce fichier csv(lien externe) et de le placer dans ma BDD.

Pour bien faire il faudrait ajouter deux champs "cat principale" et " cat sec"

Comment puis-je faire pour découper la "rubrique" qui se trouve sur le CSV avant d'insérer les deux partie coupé dans ma BDD? Sachant que le CSV est m'ai fournis via un lien externe.


14 Février 2009 11:33:56

C'est bon j'ai réussi !

Merci de votre aide.

La solution: J'ai insérer ma fonction list avant l'insertion des données dans la DB.


14 Février 2009 14:41:28

Citation :
"Jeu > Jeux vidéo";"DRIVING EMOTION"


ça il fallait le parser avant de l'enregistrer dans la BDD
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS