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 :

Incompréhension de l'auto jointure. Help !


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut Incompréhension de l'auto jointure. Help !
    Bonjour,

    Je n'arrive pas à comprendre la logique de MySQL dans une requête avec une auto jointure sur
    une table utilisant la représentation intervallaire .
    Mon exemple provient d'une requête Joomla
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.id, a.lft, a.rgt FROM jos_categories AS a LEFT JOIN jos_categories AS b ON a.lft > b.lft AND a.rgt < b.rgt WHERE a.extension="com_content" GROUP BY a.id ORDER BY a.left ASC
    Ce que je n'arrive pas à comprendre c'est comment fonctionne l'auto jointure.
    Dans mon idée (sûrement fausse), si on fait une jointure sur une même table on récupère les même valeurs (?) ce qui voudrait dire que, dans l'exemple, a.categories et b.categories sont identiques.
    Et si je continue mon raisonnement je ne comprend donc pas comment a.lft peut-il être plus grand que lui-même (b.lft), ou comment a.rgt peut il être plus petit que lui même.

    Je me doute qu'il y a une astuce mais je n'arrive pas à me représenter comment MySQL évalue cette jointure.

    Quelqu'un pourrait-il m'éclairer ?


    Merci

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 574
    Points : 7 327
    Points
    7 327
    Par défaut
    Bonjour,

    Tu peux trouver des infos dans le cours de SQLPro sur les jointures

    http://sqlpro.developpez.com/cours/sqlaz/jointures/
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Oui, j'ai déjà vu ce tuto, mais je n'arrive pas à l'adapter à mon exemple c'est pourquoi je demande un peu d'aide.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par tintin72 Voir le message
    Bonjour,

    Je n'arrive pas à comprendre la logique de MySQL dans une requête avec une auto jointure sur
    une table utilisant la représentation intervallaire .
    Mon exemple provient d'une requête Joomla
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.id, a.lft, a.rgt FROM jos_categories AS a LEFT JOIN jos_categories AS b ON a.lft > b.lft AND a.rgt < b.rgt WHERE a.extension="com_content" GROUP BY a.id ORDER BY a.left ASC
    Ce que je n'arrive pas à comprendre c'est comment fonctionne l'auto jointure.
    Dans mon idée (sûrement fausse), si on fait une jointure sur une même table on récupère les même valeurs (?) ce qui voudrait dire que, dans l'exemple, a.categories et b.categories sont identiques.
    Et si je continue mon raisonnement je ne comprend donc pas comment a.lft peut-il être plus grand que lui-même (b.lft), ou comment a.rgt peut il être plus petit que lui même.

    Je me doute qu'il y a une astuce mais je n'arrive pas à me représenter comment MySQL évalue cette jointure.

    Quelqu'un pourrait-il m'éclairer ?


    Merci
    Bonjour,


    Une jointure externe sert à joindre partiellement une table "mère" à une table fille. Si pour ligne de la table "mère" aucune ligne de la table "fille " n'est trouvée on la sélectionne quand même .

    Dans votre exemple les jointures ne servent en fait strictement à rien vu qu'auncue sélection n'est faites sur la table aliassé b

  5. #5
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    Dans votre exemple les jointures ne servent en fait strictement à rien vu qu'aucune sélection n'est faites sur la table aliassé b
    Merci beaucoup pour cet observation qui m'évite de continuer à essayer de comprendre quelque chose qui n'a pas de sens.
    En effet si je supprime la jointure dans la requête, le résultat est le même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.id, a.lft, a.rgt FROM jos_categories AS a WHERE a.extension="com_content" GROUP BY a.id ORDER BY a.lft ASC
    Je vais donc reconsidérer l'ensemble de ma requête.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Le GROUP BY ne sert à rien non plus sans fonction de regroupement dans le SELECT !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

Discussions similaires

  1. Requête avec auto jointure récalcitrante
    Par vmolines dans le forum Langage SQL
    Réponses: 15
    Dernier message: 30/03/2006, 21h31
  2. Auto jointure complexe
    Par ricobye dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/01/2006, 16h02
  3. Trier la hierarchie d'une auto-jointure
    Par Oberown dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/10/2005, 16h18
  4. resultat d'une auto jointure
    Par slc dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/09/2004, 13h54
  5. Auto jointure speciale
    Par kv000 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 14/04/2004, 13h02

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