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

Requêtes MySQL Discussion :

Chemin d'un annuaire, diminuer le nbr de requete


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 27
    Par défaut Chemin d'un annuaire, diminuer le nbr de requete
    Bonjour à tous, grace à vous, sur le forum PHP et vos pistes, j'ai reussi a faire mon script de récursivité afin d'afficher le chemin d'un annuaire selon la catégorie choisit, exemple :

    > index > informatique > programmation > php

    Le petit probleme est que pour chaque rubrique, cela fait une requete ! (ici 3, l'index n'est pas généré par mysql)

    Ce qui m'ennui un peut pour un affichage "simple" en plus des requete de l'annuaire :/, Voici le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    function chemin($cat = 0) {
    $che = mysql_query("SELECT a.id_cat, a.id_parent, a.titre FROM categories a, sites b WHERE a.id_cat='".$cat."' ORDER BY id_cat ASC LIMIT 1") OR DIE (mysql_error());
      while($afc = mysql_fetch_object($che)) {
      chemin($afc->id_parent);
      echo ' <a href="/index.php?id_cat='.$afc->id_cat.'">'.$afc->titre.'</a>';
      }
    }
    ?>
    Comme vous le voyez, pour la récursivité, je vai chercher l'id parent de la rubrique actuel afin d'affiché la catégorie dans le niveau inférieur a chaque fois, bref, la question est surtout : Y' t'il un moyen de s'y prendre autrement afin d'avoir une seul requete qui fasse le meme boulot ? (Jointure ou autre)

    Pour chaque catégorie je ne connais pas à l'avance le nombre de sous catégorie imbriqué, si c'était fixe, j'aurais pu sans doute faire une requete sur 3 niveau (2 jointure ou 2 sous requete) un truc dans le genre ...

    Bref, merci beaucoup de votre réponse.

    Si ca peut aidé je dispose de mysql 5 et php5 pour des fonctions avancé.

  2. #2
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT a.id_cat, a.id_parent, a.titre FROM categories a WHERE a.id_cat='".$cat."'"
    Devrait suffire (et être plus efficace) car 'sites' ne sert pas et 'id_cat' semble être une clef primaire.

    Pour retrouver le chemin d'un élément sans connaître sa profondeur je ne vois pas vraiment mieux. Peut-être pourrais tu conserver au niveau global l'arbre des catégories, ou du moins les premiers niveaux, ceux qui ne changent (presque) jamais (si c'est tous c'est encore mieux). Il faudrait une HashMap (déformation Java oblige, mais je crois que n'importe quel tableau PHP doit faire ça) pour retrouver rapidement une feuille par son identifiant.

    Cela dit c'est beaucoup de travail pour pas grand chose si ça ne sert que de temps à autre pour retrouver un chemin.

  3. #3
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Je vous invite à lire l'excellent article de SqlPro sur l'arborescence intervallaire.

    http://sqlpro.developpez.com/cours/arborescence/

    Je l'utilise sur l'un de mes sites.

    Cette page n'utilise que deux requêtes ! Une pour l'affichages des catégories, l'autre pour l'affichage des sites de la catégorie courante.

    http://www.clublegendes.com/html/ann...et_romans.html
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

  4. #4
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    excellant !
    C'était pas mon problème mais merci

  5. #5
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Ingénieur DevOps
    Inscrit en
    Mai 2002
    Messages
    1 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 214
    Par défaut
    Votre modélisation ne vous permettra pas de diminuer les requêtes.

    Avez-vous pensez à une solution de mise en cache par une redondance des informations ?

    Methode simplifiée :
    1-Ajoutez une table cache (id_categorie,valeur_html) id_categorie contient la clef, valeur html contient le retour de votre fonction.
    2-Créez un script qui vide le cache (DELETE FROM cache)
    3-Créez un script PHP qui rempli le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //ALGORITHME
    // Sélection de toutes les clefs
     
    // Pour chaque clef 
          //insérez la clef courante et le retour de la fonction chemin dans la table cache
    4-A chaque fois que vous insérez, modifiez, supprimez, déplacez une catégorie, vous verrouillez la table cache, videz la table le cache, recalculez le cache puis déverrouillez la table.

    Cette méthode a des inconvénients et des avantages:
    inconvénient 1 : Il faut toujours que votre cache soit à jour !
    inconvénient 2 : Le calcul du cache sera long
    inconvénient 3 : redondance d'information

    avantage essentiel : Votre script PHP utilisé par l'internaute sera bcp plus rapide
    Alexandre Tranchant
    Ingénieur DevOps pour le Ministère de l'Écologie
    Retrouvez mes articles sur PHP et Symfony

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Chemin d'un annuaire, diminuer le nbr de requete
    Par Okinou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/11/2006, 17h28
  2. Chemin d'accès au clip et scenario en flash
    Par Gential dans le forum Flash
    Réponses: 4
    Dernier message: 28/02/2003, 10h10
  3. Comment subsituer un chemin par un autre dans un réseau ?
    Par Baillard dans le forum Développement
    Réponses: 3
    Dernier message: 11/08/2002, 14h01
  4. [FORMS] Chemin des icones (intégré FAQ 150 QR)
    Par jerome62 dans le forum Forms
    Réponses: 2
    Dernier message: 30/07/2002, 08h32
  5. Algorithme de recherche de chemin
    Par amelie gaya dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 09/06/2002, 15h29

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