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 :

Trier une extraction selon un cumul de counts [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut Trier une extraction selon un cumul de counts
    Bonjour,

    Je cherche la meilleure façon (en termes de performances notamment) pour afficher les catégories d'un annuaire Internet.

    Je vous explique mon besoin :

    L'annuaire en question est divisé en catégories, sous catégories, sous sous catégories... Chacune de ces catégories, quelle que soit sa hiérarchie, peut contenir un nombre variable de sites.

    Côté internaute, il voit d'abord la page d'accueil, qui liste les catégories mères.
    La page catégorie affiche d'abord la liste des sous-catégories (le nombre total de sites contenus dans cette "branche" est affiché entre parenthèses), puis la liste des sites (un lien sera sans doute plus parlant : http://www.voyage-net.com/annuaire/index.php).

    Actuellement, la liste des sous catégories est triée par ordre alphabétique. Or, j'aimerais la trier selon le nombre de sites. L'esprit, c'est d'afficher d'abord les sous catég les plus importantes.

    En l'état, c'est impossible sans restructurer le code, car en gros, une première requête MySQL extrait les sous catég de la page consultée, puis, pour chaque résultat, une boucle de nouvelles requêtes calcule le nombre de sites associés à cette sous catégories ET ses sous-sous catégories ET ses sous-sous-sous catégories etc...

    Voyez-vous une solution propre en MySQL ? Peut-être vaut-il mieux dans un premier temps stocker les résultats dans un tableau PHP, puis modifier les tris en PHP ?

    Merci par avance pour votre aide

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Il faudrait nous en dire plus sur la structure des tables concernées et les requêtes que tu utilises actuellement.

    S'il y a une infinité potentielle de sous-sous-sous... catégories, tu peux t'intéresser à la modélisation d'un arbre par représentation intervallaire. Mais cela t'obligerait peut-être à revoir complètement ta structure de BDD et ton code.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Par défaut
    Merci pour ta réponse CinePhil.

    Alors, pour schématiser, la base est structurée de cette façon :

    - Une table CATEGORIES contenant notamment les champs id_categ, id_categ_mere, titre, description

    - Une table SITES contenant notamment les champs id_site, id_categ, titre, description

    Théoriquement, il n'y a pas de limite au nombre de sous sous ... catégories, mais dans la pratique, il n'y en aura pas plus de 5-6

    Concernant les requêtes, ça donne ça :

    Admettons que la page consultée est celle de la catégorie 1, il y a une première requête qui extrait les sous catégories :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $rq_scat = "SELECT id_categ, titre FROM CATEGORIES WHERE id_categ_mere = 1 ORDER BY titre ASC";
    $res_scat = mysql_query($rq_scat);
    ?>
    Ensuite, une boucle calcule le nombre de sites dans chacune des branches :

    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
    while ($sous_categ = mysql_fetch_assoc($res_scat))
    {
      // id de la sous_categorie est placée dans un tableau
      $list_all_cats[] = $sous_categ['id_categ'];
     
      while (list($key,$id_souscat) = each ($list_all_cats))
      {
        //Extraction des sous sous categories
        $rq_s_scat = "SELECT id_categ FROM CATEGORIES WHERE id_categ_mere = '$id_souscat'";
        $res_s_scat = mysql_query($rq_s_scat);
        // Le tableau des sous categ est incrémenté
        while ($sous_sous_categ = mysql_fetch_assoc($res_s_scat))
        {
          $list_all_cats[] = $sous_sous_categ["id_categ"];
        } 
      }
     
      // Construction de la requete calculant le nombre de sites de la branche
      $rq_nb_sites = "SELECT count(id_site) as count FROM SITES WHERE ";
      $nb_cats = sizeof($list_all_cats);
      for ($i=0;$i<$nb_cats-1;$i++)
      {
        $rq_nb_sites .= "id_categ = '$list_all_cats[$i]' or ";
      }
      // Dernière condition sans le OR à la fin
      $rq_nb_sites .= "id_categ = '$list_all_cats[$i]' ";
      $res_nb_sites = mysql_query($rq_nb_sites);
      $nb_sites = mysql_result($res_nb_sites,0,"count");
    }
    ?>
    J'aimerais au passage remercier l'auteur de PhpMyAnnuaire, script sur lequel se base l'annuaire de Voyage-Net

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Essaie dans ta première boucle, d'utiliser cette requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.id_categ, COUNT(s.id_site) As nb_sites
    FROM CATEGORIES AS c
    LEFT OUTER JOIN SITES AS s ON s.id_categ = c.id_categ
    WHERE c.id_categ_mere = '$id_sous_cat'
    GROUP BY c.id_categ
    Si j'ai bien compris comment fonctionne ton code, tu devrais obtenir directement les sous-sous catégories avec le nombre de sites.

    Mais tu es dans un cas où l'arbre intervallaire serait sans doute mieux.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Trier une table selon la valeur d'un champ
    Par nandofive dans le forum Débuter
    Réponses: 4
    Dernier message: 23/11/2008, 08h18
  2. trier une arraylist selon un critère
    Par marion5515 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 15/03/2008, 20h25
  3. trier une hashtable selon les valeurs
    Par Raylemon dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 20/06/2007, 11h44
  4. Réponses: 3
    Dernier message: 22/12/2006, 17h10
  5. [Oracle] Trier avec une extraction au sein du chaine de car
    Par magic charly dans le forum Langage SQL
    Réponses: 13
    Dernier message: 14/04/2006, 15h26

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