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 :

Grosse requête avec jointure qui ne s'exécute plus


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 90
    Points : 55
    Points
    55
    Par défaut Grosse requête avec jointure qui ne s'exécute plus
    Bonjour bonjour,
    J'ai un gros problème avec une grosse requête qui veut me lâcher
    je dois récupérer différentes informations de mes tables pour ça je relies 9 tables .. avec des jointure .. aller je balance le code :

    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
     
     
    SELECT DISTINCT zone_mag.id_zone_mag, zone.id_zone, zone.nom_z,
    					magasin.id_magasin, magasin.nom_mag, magasin.c_com AS com_mag, magasin.code_dep as dep_mag,
    					departement.code_dep, 
    					membre.id_membre as id_m,  membre.nom_m AS nom_m, membre.prenom_m AS prenom_m, membre.code_com AS com_membre, membre.departement_m AS departement_m, membre.portable_m, membre.tel_m, membre.mail_m, membre.voiture_m as voiture_m, membre.commentaire_m as commentaire_m, membre.notation_chiffre as notation_chiffre, membre.notation_nuance as notation_nuance,
    					temp_attribution.id_temp_attrib, 
    					entretien.note_tel, entretien.detail_note_tel,  entretien.note_phy,  entretien.detail_note_phy, entretien.commentaire_phy
    					FROM temp_attribution
    				LEFT JOIN zone ON  temp_attribution.id_projet = zone.id_projet
    				LEFT JOIN zone_mag ON zone.id_zone = zone_mag.id_zone
    				LEFT JOIN magasin ON zone_mag.id_mag = magasin.id_magasin
    				RIGHT JOIN attribution ON magasin.id_magasin = attribution.id_magasin
    				LEFT JOIN departement ON magasin.code_dep = departement.code_dep
    				LEFT JOIN departement_lim ON departement.code_dep = departement_lim.departement
    				INNER JOIN membre ON ( membre.departement_m = departement_lim.dep_lim OR membre.departement_m = departement.code_dep) AND ( membre.id_membre = temp_attribution.id_membre)
    				LEFT JOIN entretien ON membre.id_membre = entretien.id_membre 
    				WHERE zone.id_projet ='$projet' AND temp_attribution.id_projet = '$projet' AND  attribution.id_projet='$projet' ";
    Pour des projets légers ça s'affiche mais pour des projets plus gros j'ai l'erreur "Query execution was interrupted"
    Je ne peux pas séparer ma requête pour faire un tri sur le tableau résultant
    Je suis bloquée avec un tableau qui ne s'affiche jamais pour les gros projets :'(

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Difficile d'être affirmatif puisqu'on a pas d'information sur l'objectif de la requête, cependant quelques remarques :
    • Je ne pense pas que vous ayez besoin des jointures externes surtout que vous en cassez plusieurs avec votre clause WHERE => remplacez les LEFT et RIGHT par INNER
    • DISTINCT est également potentiellement inutile
    • Vous passez sur la table ATTRIBUTION or vous ne vous en servez ni dans les colonnes sélectionnées ni pour faire le lien avec d'autres tables, vous pouvez donc vous en passer.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 90
    Points : 55
    Points
    55
    Par défaut
    Ah oui c'est vrai la table attribution n'a pas besoin d'être reliée à tous ça, INNER sera mieux, ça me donne ça :

    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
     
     
    SELECT zone_mag.id_zone_mag, zone.id_zone, zone.nom_z,
    					magasin.id_magasin, magasin.nom_mag, magasin.c_com AS com_mag, magasin.code_dep as dep_mag,
    					departement.code_dep, 
    					membre.id_membre as id_m,  membre.nom_m AS nom_m, membre.prenom_m AS prenom_m, membre.code_com AS com_membre, membre.departement_m AS departement_m, membre.portable_m, membre.tel_m, membre.mail_m, membre.voiture_m as voiture_m, membre.commentaire_m as commentaire_m, membre.notation_chiffre as notation_chiffre, membre.notation_nuance as notation_nuance,
    					temp_attribution.id_temp_attrib, 
    					entretien.note_tel, entretien.detail_note_tel,  entretien.note_phy,  entretien.detail_note_phy, entretien.commentaire_phy
    					FROM temp_attribution
    				INNER JOIN zone ON  temp_attribution.id_projet = zone.id_projet
    				INNER JOIN zone_mag ON zone.id_zone = zone_mag.id_zone
    				INNER JOIN magasin ON zone_mag.id_mag = magasin.id_magasin
    				INNER JOIN departement ON magasin.code_dep = departement.code_dep
    				INNER JOIN departement_lim ON departement.code_dep = departement_lim.departement
    				INNER JOIN membre ON ( membre.departement_m = departement_lim.dep_lim OR membre.departement_m = departement.code_dep) AND ( membre.id_membre = temp_attribution.id_membre)
    				INNER JOIN entretien ON membre.id_membre = entretien.id_membre 
    				WHERE zone.id_projet ='$projet' AND temp_attribution.id_projet = '$projet'
    Mais ma requete ne passe toujours pas

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Regardez le plan d’exécution de la requête (EXPLAIN) et assurez-vous que toutes vos clés étrangères sont bien indexées.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    que donne ceci :

    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
     
     
     
    SELECT zone_mag.id_zone_mag, zone.id_zone, zone.nom_z,
    					magasin.id_magasin, magasin.nom_mag, magasin.c_com AS com_mag, magasin.code_dep AS dep_mag,
    					departement.code_dep, 
    					membre.id_membre AS id_m,  membre.nom_m AS nom_m, membre.prenom_m AS prenom_m, membre.code_com AS com_membre, membre.departement_m AS departement_m, membre.portable_m, membre.tel_m, membre.mail_m, membre.voiture_m AS voiture_m, membre.commentaire_m AS commentaire_m, membre.notation_chiffre AS notation_chiffre, membre.notation_nuance AS notation_nuance,
    					temp_attribution.id_temp_attrib, 
    					entretien.note_tel, entretien.detail_note_tel,  entretien.note_phy,  entretien.detail_note_phy, entretien.commentaire_phy
    					FROM temp_attribution
    				INNER JOIN zone ON  temp_attribution.id_projet = zone.id_projet
    				INNER JOIN zone_mag ON zone.id_zone = zone_mag.id_zone
    				INNER JOIN magasin ON zone_mag.id_mag = magasin.id_magasin
    				INNER JOIN departement ON magasin.code_dep = departement.code_dep
     
    				INNER JOIN membre 
    					ON membre.id_membre = temp_attribution.id_membre 
    					AND  ( membre.departement_m = departement.code_dep 
    					OR membre.departement_m IN 
    						(SELECT dep_lim FROM departement_lim 
    						WHERE code_dep  =departement.code_dep  )
    					)
    				INNER JOIN entretien ON membre.id_membre = entretien.id_membre 
    				WHERE zone.id_projet ='$projet' AND temp_attribution.id_projet = '$projet'

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 90
    Points : 55
    Points
    55
    Par défaut
    j'ai vérifié effectivement je n'avais pas indexé mes clés étrangères la ça fonctionne c'est long quant c'est en ligne mais c'est a cause de la connexion

    Est ce que ça ne serait pas mieuxde créer une table temporaire pour cette requete ?ça ne serait pas plus rapide ?




    je vous remercie

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

Discussions similaires

  1. Requête sql avec jointure qui ne fonctionne pas
    Par Damien062 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 10/03/2015, 09h18
  2. Requête avec jointure qui retourne null si pas de valeur
    Par jubourbon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/09/2011, 11h10
  3. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13
  4. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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