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 :

Requete SQL Avancée


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut Requete SQL Avancée
    Coucou à tous,

    Je suis en train de me battre avec du SQL dit "avancé"... Alors je sais pas si ce que je cherche à faire est avancé ou pas, mais ce qui est sur, c'est que j'y arrive pas.

    Les requêtes se passent dans une table "rubrique"

    disons donc que la table est composée de deux colonnes : id et parent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    +------+----------+
    +--id--+--parent--+
    +------+----------+
    Une rubrique qui a pour parent RIEN (NULL) est dites "de niveau 1"
    Une rubrique qui a un parent qui lui même n'a pas de parent est dites de "niveau 2"
    Une rubrique qui a un a un GRAND PARENT qui n'a pas de parent est dites de "niveau 3" (une rubrique qui a un parent, qui a un parent qui n'a pas de parent)

    voici ce que cela pourrait donner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    +------+----------+
    +--id--+--parent--+
    +------+----------+
    +--1---+---NULL---+
    +--2---+---NULL---+
    +--3---+---NULL---+
    +--4---+-----1----+
    +--5---+-----2----+
    +--6---+-----5----+
    +------+----------+

    Donc si on fait une arborescence de ça... ca donnerait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1
    |-----4
    2
    |-----5
    ------|------6
    3
    Ma question donc est :
    "Comment récupérer toutes les rubriques de niveau 2 (ici 4 et 5) en une seule requête?"
    La seconde question est
    "Comment récupérer toutes les rubriques de niveau 3 (ici 6) en une seule requête?"

    Il ne peut pas y avoir de 4e niveau (parce que je l'ai décidé )

    Voilà ce que j'ai essayé pour les rubriques de niveau 2... mais j'ai eu une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          SELECT parent FROM Rubrique WHERE parent IS NOT NULL AND parent IN (SELECT * FROM Rubrique WHERE Rub_Rubrique_Id IS NULL)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MySQL a répondu:Documentation
    #1241 - Operand should contain 1 column(s)

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Au lieu d'utiliser une sous-requête, il peut être plus simple de passer par des jointures.

    Pour sélectionner les rubriques de niveau 2 (1 seul parent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT R1.*
    FROM Rubrique R1
    INNER JOIN Rubrique R2 ON R1.parent=R2.id
    WHERE R2.parent IS NULL
    Le INNER JOIN garantit que R1 a un parent : R2.
    Le WHERE indique que R2 n'a aucun parent.
    R1 n'a donc qu'un seul parent : R1.

    Pour obtenir les autres niveaux, il suffit d'ajouter des clauses INNER JOIN.

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Voilà la requête qui, je l'espère, va te permettre de résoudre ta question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select R1.id as id1, r1.parent as parent1, r2.id as id2, r2.parent as parent2
    from rubrique R1
    left join rubrique R2 on R1.parent = R2.id
    Les rubriques de niveau 2 sont donc les id1 dont parent1 (ou id2) n'est pas null et parent2 est null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select R1.id
    from rubrique R1
    left join rubrique R2 on R1.parent = R2.id
    where R2.id is not null and R2.parent is null
    Les rubriques de niveau 3 sont les id1 dont parent2 n'est pas null :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select R1.id
    from rubrique R1
    left join rubrique R2 on R1.parent = R2.id
    where R2.id is not null and R2.parent is not null
    Ton cas est un exemple de récursivité. Pour bien traiter ces problèmes souvent épineux, je te recommande la lecture de l'article suivant : arbres et SQL.

    Bon courage,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Membre régulier Avatar de Lost In Translation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 166
    Points : 89
    Points
    89
    Par défaut
    Ah bah là, je reconnais que c'est pas du sql de petite fille comme je fais

    Il y a une époque, je me suis dit "boarf, tout faire en une requête ou en 3... je vois pas ce que ça change".

    Je commence un peu à comprendre qu'à cette époque, j'ai raisonné comme un plouc

    Merci Jérémya et Ced pour vos aides. Ca a marché du tonnerre. Je vais prendre quelques jours à l'occase pour me replonger dans le sql avancé, je pense que ça fait tout : même le café

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour, j'ai un problème similaire.. par contre le nombre d'enfant n'est pas fixe. Alors je ne peux savoir d'avance combien de LEFT JOIN je dois faire... Pouvez-vous m'éclaircir?

    Merci

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Là, c'est beaucoup plus compliqué (il faudrait passer par une fonction PL/SQL).
    Regarde l'article que j'ai cité plus haut, tout y est parfaitement expliqué.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39
  2. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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