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 :

Requête compliquée pour menu multi-niveau


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Requête compliquée pour menu multi-niveau
    Bonjour à tous,

    J'ai 2 tables dans ma base de donnée, l'une contenant des catégories et des sous-catégories et l'autre contenant les pages.
    Je souhaite faire une requête pour afficher le menu du site qui comprend les catégories, les sous-catégorie, et les pages
    Comme un dessin vaut mieux qu'un long discours voici ce que j'aimerais:




    Sur l'image on peut voir les possibilités pour le menu :
    -On affiche les catégories principales
    -Une page sans catégorie doit être au niveau des catégories principales
    -On affiche les pages appartenant à une catégorie principale
    -On affiche les sous-catégories
    -On n'affiche PAS les pages appartenant à une sous-catégorie

    Voici mes tables dans ma base

    Table Catégorie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    +----------+----------------+------------+-------------+
    | cat_id   | cat_nom        | cat_titre  | cat_parent  |
    +----------+----------------+------------+-------------+
    |      1   | categorie1     | blablalaal |      0      |
    |      3   | categorie3     | blablalaal |      0      |
    |      4   | categorie4     | blablalaal |      0      |
    |      5   | categorie5     | blablalaal |      0      |
    |      6   | sous-categorie6| blablalaal |      5      |
    |      7   | sous-categorie7| blablalaal |      5      |
    |      8   | categorie8     | blablalaal |      0      |
    |      9   | sous-categorie9| blablalaal |      8      |
    +----------+----------------+------------+-------------+
    Table Page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    +----------+-------------+------------+-------------+
    | page_id  | page_nom    | page_titre | page_cat_id |
    +----------+-------------+------------+-------------+
    |      1   | page1       | blablalaal |      0      |
    |      2   | page2       | blablalaal |      3      |
    |      3   | page3       | blablalaal |      3      |
    |      4   | page4       | blablalaal |      5      |
    |      5   | page5       | blablalaal |      0      |
    |      6   | page6       | blablalaal |      8      |
    +----------+-------------+------------+-------------+
    J'ai testé une cinquantaine de requêtes avec des LEFT JOIN et je n'arrive pas à faire ce que je souhaite.
    Je souhaite donc tout d'abord savoir si c'est réalisable et deuxièmement comment dois-je m'y prendre

    Par avance merci de votre aide

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    J'ai pas testé mais un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT page.*, c1.*
    FROM (Page, Categorie AS c1)
    LEFT JOIN Categorie AS c2 ON (c2.cat_parent =0)
    WHERE page_cat_id=c2.cat_id
    Avec ça tu dois pouvoir y arriver.
    Il faudra sûrement retravailler la requête, mais le principe de faire appelle 2 fois à la même table (dont une avec condition) devrait te permettre de régler ton problème.

  3. #3
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    C'est une horreur cette requête !
    Mélange des syntaxes des jointures et pas de condition de jointure sur la jointure externe !
    Une révision sur les jointures s'impose !

    Revenons au problème...

    Pour avoir les catégories et leurs sous-catégories, tu peux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT c1.cat_id AS cat_id_mere,
        c1.cat_nom AS cat_nom_mere,
        c1.cat_titre AS cat_titre_mere,
        c2.cat_id AS cat_id_fille,
        c2.cat_nom AS cat_nom_fille,
        c2.cat_titre AS cat_titre_fille
    FROM categorie AS c1
    LEFT OUTER JOIN categorie AS c2 ON c2.cat_parent = c1.cat_id
    ORDER BY c1.cat_id, c2.cat_id
    Pour avoir les pages sans catégorie ou avec une catégorie mère, tu peux faire ceci, la requête excluant les catégories qui ont un parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.page_id, p.page_nom, p.page_titre, p.page_cat_id, c.cat_id
    FROM page AS p
    LEFT OUTER JOIN categorie AS c ON p.page_cat_id = c.cat_id 
        AND c.cat_parent = 0

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour vos réponses.

    @Cinephil : La première requête est bonne et m'affiche bien les catégories et sous-catégories, en revanche la deuxième m'affiche tout de même les pages avec sous-catégories.
    De plus comment faire pour n'avoir qu'une seule requête globale ?

    D'avance merci

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par toons43 Voir le message
    @Cinephil : La première requête est bonne et m'affiche bien les catégories et sous-catégories, en revanche la deuxième m'affiche tout de même les pages avec sous-catégories.
    Effectivement, il faut faire plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.page_id, p.page_nom, p.page_titre, p.page_cat_id, c.cat_id
    FROM page AS p
    LEFT OUTER JOIN categorie AS c ON p.page_cat_id = c.cat_id 
    WHERE c.cat_parent IS NULL
        OR c.cat_parent = 0
    La première partie du WHERE devrait donner les pages sans catégorie et la seconde partie les pages des catégories principales, en excluant les sous-catégories.

    De plus comment faire pour n'avoir qu'une seule requête globale ?
    Essaie cette requête mais je ne suis pas sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT c1.cat_id AS cat_id_mere,
        c1.cat_nom AS cat_nom_mere,
        c1.cat_titre AS cat_titre_mere,
        c2.cat_id AS cat_id_fille,
        c2.cat_nom AS cat_nom_fille,
        c2.cat_titre AS cat_titre_fille
        p.page_id, p.page_nom, p.page_titre, p.page_cat_id
    FROM categorie AS c1
    LEFT OUTER JOIN categorie AS c2 ON c2.cat_parent = c1.cat_id
    RIGHT OUTER JOIN page AS p ON p.page_cat_id = c1.cat_id
    WHERE c1.cat_parent IS NULL
        OR c1.cat_parent = 0
    ORDER BY c1.cat_id, c2.cat_id, p.page_id

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Merci pour le coup de main.

    Effectivement la 1ere requête fonctionne desormais.
    En revanche la requête globale ne fonctionne pas, elle sort les pages sans categorie et celles avec une catégorie mère, mais elle n'affiche pas les categories mères qui n'ont que des sous-categories et ça n'affiche pas non plus les sous-categories. Mais on y est presque!!!

    Encore merci

Discussions similaires

  1. [MySQL] Requête(s ?) pour menu déroulant
    Par sitschner dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/06/2008, 19h07
  2. [SQL] Requête SQL trop compliquée pour lui.
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/05/2006, 23h52
  3. besoin aide pour requête compliquée ......
    Par Ickou dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/04/2006, 18h43
  4. [Menu recherché] Vertical, multi-niveau, pas de frame
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/03/2006, 22h31
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 16h17

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