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 :

Remplacer les sous requêtes grâce aux jointures


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 36
    Points : 35
    Points
    35
    Par défaut Remplacer les sous requêtes grâce aux jointures
    Bonjour (ou rebonjour à certain ),
    Je viens de faire un petit tour sur le forum, et je suis maintenant persuader que les jointures sont beaucoup plus performantes que les sous requêtes.
    Or, malheureusement, étant encore débutant, je ne maitrise pas encore assez les jointures...

    C'est la raison pour laquelle je viens vers vous. Je demande juste une genre de "conversion" d'une requêtes faite par sous requête en requête faite par jointure.

    La voici (Ce sera la seule, après je me débrouillerais ne vous inquiétez pas ):

    (D'abord le schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    table1 (table1_id, table1_age)
    table2 (table2_id, table1_id, table3_id)
    table3 (table3_id, table3_contenu)
    )

    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
     
     
    SELECT
    	table3_id, table3_contenu
    FROM 
    	table3
    WHERE
    	table3_id IN
    	(SELECT 
    		table3_id
    	FROM
    		table2
    	WHERE
    		table1_id IN
    		(SELECT 
    			table1_id
    		FROM
    			table1
    		WHERE
    			table1_age = ?))
    Merci beaucoup à tous !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 45
    Points
    45
    Par défaut
    je pense que je peux t'aider pour ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM table2
    INNER JOIN table1 ON table1.table1_id= table2.table1.id
    INNER JOIN table3 ON table3.table3_id= table2.table3.id
    C'est ce que tu veux ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 36
    Points : 35
    Points
    35
    Par défaut
    Merci !

    Mais, on tu peux récupérer les données de la table3 en faisant un SELECT la table2 ?
    J'avoue ne pas comprendre...

    Merci en tout cas, je trouve çà sympa de s'entraider .

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Points : 45
    Points
    45
    Par défaut
    Normalement, oui.
    Ceci dit, tu peux tourner ta requete comme tu le souhaite...


    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT * 
    FROM table1
    INNER JOIN table2 ON table1.table1_id= table2.table1.id
    INNER JOIN table3 ON table3.table3_id= table2.table3.id
     
     
    SELECT * 
    FROM table3
    INNER JOIN table2 ON table1.table1_id= table2.table1.id
    INNER JOIN table1 ON table3.table3_id= table2.table3.id
    ps: j'ai peut etre fait une erreur, je t'avoue que j'écris à la vite....

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 36
    Points : 35
    Points
    35
    Par défaut
    Ok dac' .

    Je vérifie celà et je te dis le résultat tout de suite !

    Merci encore !

    ps : il y a juste les derniers points de chaque ligne à remplacer par des underscores mais j'ai compri le raisonnement

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    L'ordre dans lequel tu écris les jointures est juste une question de facilité de lecture.

    Ton schéma (MCD de la méthode Merise) est le suivant :
    Table1 -0,n----Relation----0,n- Table3

    Les cardinalités 0,n - 0,n entraînent la création d'une troisième table dite "associative", que tu as appelé 'Table2'.

    On voit que c'est Table2 qui est en relation avec les deux autres alors il est facile de partir de cette table pour écrire les 2 jointures avec les deux autres tables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM table2
    INNER JOIN table1 ON table1.table1_id= table2.table1_id
    INNER JOIN table3 ON table3.table3_id= table2.table3_id
    On peut aussi choisir de parcourir la branche du schéma dans l'ordre. Il est alors conseillé d'indenter la requête pour rendre visible le fait que toutes les jointures ne se font pas avec la table du FROM.

    Ici la seconde jointure part de table2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM table1
    INNER JOIN table2 ON table1.table1_id= table2.table1.id
      INNER JOIN table3 ON table3.table3_id= table2.table3.id
    Et là la aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM table3
    INNER JOIN table2 ON table3.table3_id= table2.table2_id
      INNER JOIN table1 ON table1.table1_id= table2.table2_id
    Il y avait d'ailleurs une erreur dans la dernière requête que j'ai corrigée.
    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 !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 36
    Points : 35
    Points
    35
    Par défaut
    D'accord.

    Merci beaucoup pour cette précision.
    Et merci à tout ceux qui ont pris attention à mon souci.

    Bonnes journées !

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

Discussions similaires

  1. Peut-on remplacer une sous-requête par une jointure ?
    Par shimomura22 dans le forum Développement
    Réponses: 13
    Dernier message: 14/01/2015, 10h46
  2. [RegEx] Positions des sous-chaînes grâce aux regex
    Par oneTime dans le forum Langage
    Réponses: 1
    Dernier message: 12/09/2008, 14h57
  3. Remplacer une sous-requête par une jointure
    Par MPQuatre dans le forum Requêtes
    Réponses: 6
    Dernier message: 05/12/2007, 18h28
  4. Limitation d'Access pour les sous-requêtes ?
    Par guidav dans le forum Access
    Réponses: 5
    Dernier message: 19/10/2006, 13h18
  5. [IB 6, FireBird 1.5] SKIP dans les sous-requêtes
    Par Magnus dans le forum Langage SQL
    Réponses: 8
    Dernier message: 15/09/2005, 15h14

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