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 :

Vue et sous-requête ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut Vue et sous-requête ?
    Bonjour,

    Je cherche à construire une vue à partir de 4 tables, et il me semble que je dois utiliser un subselect.
    Or lorsque je construit cette vue et que je l'exécute, le serveur mysql se met à "mouliner", occupe plus de 50% de la CPU... voire beaucoup plus et ne rend pas la main dans un temps humainement raisonnable.
    Voici donc le modèle :

    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
    Table T1
    Id
    Tag
    T3_Id
    T4_Id
     
    Table T2
    Owner_T1Id
    Collect_T1Id
    Value
     
    Table T3
    Id
    Name
     
    Table T4
    Id
    Place
    Toutes les tables utilisent le moteur InnoDB.

    Il apparaît que chaque enregistrement de T2 contient 2 Id de T1.
    La clé de mon problème est de construire un select qui me permette de ramener à la fois le T3.Name correspondant au Owner_T1Id et le T3.Name correspondant au T2.Collect_T1Id. Pareil pour le LastName de T4.
    J'avais utilisé des subselect mais ça semble conduire au problème évoqué, et ce sur 2 machines, et deux install de mysql complètement différentes.
    J'exclue donc à priori un artéfact dû à une mauvaise install.

    Le select ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Select T1.Tag,
             T2.Owner_T1Id,
             T2.Collect_T1Id
             (select T3.Name from T3 where T3.Id=T2.Collect_T1Id) as CollectName
             (select T4.LastName from T4 where (T3.Id=T2.Collect_T1Id and T3.T4_Id=T4.Id) as Place
    from T1,T2
    where T2.Owner_T1Id=T1.Id
    Il y a en réalité plus de champ à afficher, mais j'ai isolé ici ce qui posait problème et que je voudrais écrire autrement.

    Merci de votre aide
    Cordialement,
    J-L

  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
    Essaie plutôt avec des jointures normalisées (depuis 1992 cette syntaxe ! ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T1.Tag, T2.Owner_T1Id, T2.Collect_T1Id, 
      T3.Name AS CollectName, T4.LastName AS Place
    FROM T1
    INNER JOIN T2 ON T2.Owner_T1Id = T1.Id
      INNER JOIN T3 ON T3.Id = T2.Collect_T1Id
        INNER JOIN T4 ON T3.T4_Id = T4.Id
    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 à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut Une précision
    Merci déjà pour ce conseil.

    Néanmoins, je me suis sûrement mal expliqué.
    Pour chaque ligne de T2, je veux récupérer pour chaque T1Id dans T2, (Owner et Collect) le T3.Name et le T4.Place correspondant.
    C'est là dessus que je bute.

  4. #4
    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
    Et alors, elle ne fait pas ça ma requête ?
    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 !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut
    Si j'ai bien compris ton problème, ta requête devrait plutôt ressembler à ç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
    	T1.Tag,
    	T2.Owner_T1Id,
    	T2.CollectT1_Id,
    	T3.Name,
    	T3bis.Name,
    	T4.Place,
    	T4bis.Place
     
    FROM 
    	T1
    	INNER JOIN T2 ON T1.Id=T2.Owner_T1Id
    	INNER JOIN T3 ON T2.Owner_T1Id=T3.Id
    	INNER JOIN T3 AS T3bis ON T2.CollectT1_Id=T3.Id
    	INNER JOIN T4 AS T4 ON T2.CollectT1_Id=T4.Id
    	INNER JOIN T4 AS T4bis ON T2.CollectT1_Id=T4.Id

    Par contre ça ne change pas grand-chose à ton problème de performance...

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut C'est un peu plus complexe...
    Merci pour vos réponses, je commence à voir dans quelle direction aller.
    La solution va sûrement passer par (je ne sais pas le terme exact) l'utilisation de 2 alias pour une même table.
    Cela dit, j'ai mal décrit le fond du problème. La difficulté vient du fait que T2.Owner_T1Id amène à T1 dans laquelle on trouve une clé étrangère (T3_Id qui amène à T3 où l'on trouve T3.Name et une clé étrangère T4_Id qui amène à T4 où l'on trouve enfin T4.Place.
    Et pareil pour T2.Collect_T1Id.


    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
    TABLE T1
    Id
    Tag
    T3_Id
     
    TABLE T2
    Owner_T1Id
    Collect_T1Id
    Value
     
    TABLE T3
    Id
    Name
    T4_Id
     
    TABLE T4
    Id
    Place
    Je suis en train de voir comment je peux adapter la solution de mrcmrc.

    Merci à vous.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Points : 22
    Points
    22
    Par défaut Merci, j'ai une solution
    Merci à tous les deux.
    J'ai fini par trouvé une solution qui devrait me convenir.

    Moyennant l'ajout d'un champ T4_Id dans T1 pour éviter de multiplier les indirections, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT T1.Tag,
    T2.Value
    T2.Owner_T1Id
    T2.Collect_T2Id
    FROM T2 
    INNER JOIN T1 as T1_1 ON T2.Owner_T1Id = T1_1.Id 
    INNER JOIN T1 as T1_2 ON T2.Collect_T1Id = T1_2.ID 
    INNER JOIN T3 as T3_1 ON T1_1.T3_Id = T3.Id 
    INNER JOIN T3 as T3_2 ON TT1_1.T3_Id = T3.Id 
    INNER JOIN T4 as T4_1 ON ( T1_1.T4_Id = T4_1.Id ) 
    INNER JOIN T4 as T4_2 ON ( T1_1.T4_Id = T4_2.Id )
    Je pense que je suis arrivé à la bonne solution.
    Merci à vous, et bon week-end !

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

Discussions similaires

  1. optimisation d'une vue avec plusieurs sous-requêtes
    Par jean62 dans le forum Développement
    Réponses: 7
    Dernier message: 08/08/2012, 15h29
  2. Création de vue avec besoin de sous requête
    Par Chtulus dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/06/2008, 15h34
  3. Sous-requête dans une vue
    Par Crystalle dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/12/2007, 11h40
  4. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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