Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/01/2012, 17h01   #1
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
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 :
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
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 18h25   #2
Membre Expert
 
Avatar de kain_tn
 
Homme
Inscription : mars 2005
Messages : 577
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations forums :
Inscription : mars 2005
Messages : 577
Points : 1 209
Points : 1 209
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 :
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;
}
kain_tn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 18h38   #3
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
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.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2012, 23h59   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 657
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 657
Points : 2 660
Points : 2 660
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 :
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
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 09h22   #5
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 595
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 595
Points : 123
Points : 123
Citation:
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 :
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.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 15h37   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h57.


 
 
 
 
Partenaires

Hébergement Web