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 :

Ordre des inner join, left outer join et autres


Sujet :

Requêtes MySQL

  1. #1
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut Ordre des inner join, left outer join et autres
    Bonjour,

    J'ai cette requête pour le moins complexe.
    Je précise que la table t8 est une table de nomenclature qui ne nécessite pas de date.

    Pour le reste, voici ma question :

    Si j'ai cet ordre (inner join d'abord, puis left outer simple, puis left outer imbriqué), la requete me renvoie ce que j'attends.

    Si je ne place pas en dernier le left outer imbriqué, curieusement, la requête filtre bien plus et me renvoie moins de tuples !

    Pourquoi l'ordre a-t-il de l'importance ? Est-ce dû à l'algorithme mysql ou bien ma requête est-elle tout à fait mal construite ?

    Merci d'avance de vos lumières...
    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
    33
    34
    35
    36
    37
    38
    39
    40
     
    SELECT blablabla
    	from t1
    	inner join t2
    	on(
    		t1.machin=t2.machin
    	)
    	inner join t3
    	on(
    		t1.truc=t3.truc
    	)
    	left outer join t4
    	on (
    		t1.bidule=t4.bidule
    		and  t4.debut <= "2012-12-31" and t4.fin >= "2012-01-01"
    	)
    	left outer join t5
    	on (
    		t1.toto=t5.toto
    		and  t5.debut <= "2012-12-31" and t5.fin >= "2012-01-01"
    	)
    	left outer join t6
    		left outer join t7
    			left outer join t8
    			on (
    				t7.tata=t8.tata
    			)	
    		on (
    			t6.titi=t7.titi
    			and t6.zaza=t7.zaza
    			and  t7.debut <= "2012-12-31" and t7.fin >= "2012-01-01"
    		)
    	on (
    		t1.zozo=t6.zozo
    		and  t6.debut <= "2012-12-31" and t6.fin >= "2012-01-01"
    	)
     
    	where t1.debut <= "2012-12-31" and t1.fin >= "2012-01-01"
    	and  t2.debut <= "2012-12-31" and t2.fin >= "2012-01-01"
    	and  t3.debut <= "2012-12-31" and t3.fin >= "2012-01-01"
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  2. #2
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Inutile de mettre des parenthèses partout, on est pas chez Access !

    2) Pourquoi imbriquer des LEFT JOIN ?
    À mon avis, il suffit de les écrire en entier les une dernière les autres.

    3) En SQL, les valeurs textuelles et de date s'entourent d'apostrophes, pas de guillemets !

    4) Pourquoi ne pas directement donner la requête réelle, une expression du besoin, la structure des tables impliquées ?
    Ce serait plus simple pour analyser ce qui, éventuellement, ne va pas.

    Voici la requête fictive récrite :
    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
     
    SELECT blablabla
    FROM t1
    INNER JOIN t2 ON t1.machin = t2.machin
    INNER JOIN t3 ON t1.truc = t3.truc
    LEFT OUTER JOIN t4
    	ON t1.bidule = t4.bidule
    	AND  t4.debut <= '2012-12-31'
    	AND t4.fin >= '2012-01-01'
    LEFT OUTER JOIN t5
    	ON t1.toto = t5.toto
    	AND  t5.debut <= '2012-12-31'
    	AND t5.fin >= '2012-01-01'
    LEFT OUTER JOIN t6
    	ON t1.zozo = t6.zozo
    	AND t6.debut <= '2012-12-31'
    	AND t6.fin >= '2012-01-01'
     
    	LEFT OUTER JOIN t7
    		ON t6.titi = t7.titi
    		AND t6.zaza = t7.zaza
    		AND t7.debut <= '2012-12-31'
    		AND t7.fin >= '2012-01-01'
     
    		LEFT OUTER JOIN t8 ON t7.tata = t8.tata
     
    WHERE t1.debut <= '2012-12-31'
    	AND t1.fin >= '2012-01-01'
    	AND t2.debut <= '2012-12-31'
    	AND t2.fin >= '2012-01-01'
    	AND t3.debut <= '2012-12-31'
    	AND t3.fin >= '2012-01-01'
    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 !

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Merci beaucoup, cinephil.
    Mon erreur (principale) était donc de chercher à imbriquer les left outer.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

Discussions similaires

  1. Requête complexe avec des LEFT OUTER JOIN
    Par bella125 dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/04/2014, 11h51
  2. Problème de jointure avec INNER JOIN et LEFT OUTER JOIN
    Par tonio-lille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/02/2006, 12h45
  3. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 16h08

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