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 :

Optimisation requete avec select Imbriqué


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Optimisation requete avec select Imbriqué
    Bonjour ,

    j'ai une requête qui est extrêmement longue a s'exécute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT u.`ref`,
    CONCAT(u.`Nom`,' ',u.`Prenom`) AS NomPrenom,
    ( u.`totalconges`)AS cptotal,
    (u.`congespris`) AS cppris ,
    (select sum(nbjours) from conges where mail_demandeur = u.Email and Flag_censure = '0'and typeConges = '1' and datedebutconges >= '2010-06-01' and datefinconges <= '2011-05-31') AS cpattente,
    (select sum(nbjours)from conges where mail_demandeur= u.Email and Flag_censure = '1' and typeConges = '1' and refuse = '1' and datedebutconges >= '2010-06-01'and datefinconges <= '2011-05-31') AS cprefuse ,
    (select sum(nbjours)from conges where mail_demandeur= u.Email and Flag_censure = '1' and refuse ='0'and typeConges = '1'and datedebutconges >= '2010-06-01' and datefinconges <= '2011-05-31') AS cpvalid
    FROM users u INNER JOIN conges c ON u.Email = c.mail_demandeur
    where u.Flag_censure ='1'
    group by Nom , prenom
    Elle me retourne un affichage de type :
    Nom Prenom | Cptotal | Cpris | cpattente | cprefuse | cpvalid

    les 3premieres colonnes proviennent d'une table users , et les autres d'une table conges

    comment faire pour que dans le select j'ai des sum() avec des conditions...

    Merci de votre aide.

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 287
    Points
    7 287
    Par défaut
    Citation Envoyé par sintesi974 Voir le message
    comment faire pour que dans le select j'ai des sum() avec des conditions...
    Bonjour,

    vous pouvez essayer de faire plusieurs jointures sur la même table et passer vos conditions dans la condition de jointure:

    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
     
    SELECT
        u.ref,
        CONCAT(u.Nom, ' ', u.Prenom) AS NomPrenom,
        u.totalconges AS cptotal,
        u.congespris AS cppris,
        SUM(c_refuse.nbjours) AS cprefuse
    FROM users u
        LEFT JOIN conges c_refuse
            ON (u.Email = c.mail_demandeur AND 
                c_refuse.Flag_censure = '1' AND 
                c_refuse.typeConges = '1' AND 
                c_refuse.refuse = '1' AND 
                c_refuse.datedebutconges >= '2010-06-01'AND 
                c_refuse.datefinconges <= '2011-05-31')
        LEFT JOIN conges c_valid
            ON (...)
    ...
    GROUP BY ...
    Après, en fonction de vos résultats vous pouvez voir si il vous faut utiliser une jointure interne ou externe (INNER JOIN ou LEFT/RIGHT OUTER JOIN)

    Citation Envoyé par sintesi974 Voir le message
    Bonjour ,
    j'ai une requête qui est extrêmement longue a s'exécute :
    Un petit truc qui peut aider aussi pour améliorer les performances d'une requête en SELECT: mettre le mot EXPLAIN devant la requête et analyser le résultat (plan d'exécution de la requête).
    Ex:
    http://dev.mysql.com/doc/refman/5.0/fr/explain.html

    Cordialement
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Suite
    Merci kain_tn ,

    cela ma beaucoup aider , par contre une petite erreur subsiste des que je cumule sur c_valid , mes resultats sur certains user de ma table , donne des incoherences...

    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
    SELECT
        u.ref,
        CONCAT(u.Nom, ' ', u.Prenom) AS NomPrenom,
        u.totalconges AS cptotal,
        u.congespris AS cppris,
        SUM(c_attente.nbjours) AS cpattente,
        SUM(c_refuse.nbjours) AS cprefuse,
        SUM(c_valid.nbjours) AS cpvalid
    FROM users u
         LEFT JOIN conges c_attente
            ON (u.Email = c_attente.mail_demandeur AND
                c_attente.typeconges = '1' AND
                c_attente.refuse = '0'and
                c_attente.Flag_censure = '0' AND
                c_attente.datedebutconges >= '2010-06-01'AND
                c_attente.datefinconges <= '2011-05-31')
         LEFT JOIN conges c_refuse
            ON (u.Email = c_refuse.mail_demandeur AND
                c_refuse.typeConges = '1' AND
                c_refuse.Flag_censure = '1' AND
                c_refuse.refuse = '1' AND
                c_refuse.datedebutconges >= '2010-06-01'AND
                c_refuse.datefinconges <= '2011-05-31')
         LEFT JOIN conges c_valid
            ON (u.Email = c_valid.mail_demandeur AND
                c_valid.typeconges = '1' AND
                c_valid.Flag_censure = '1' AND
                c_valid.refuse = '0' AND
                c_valid.datedebutconges >= '2010-06-01'AND
                c_valid.datefinconges <= '2011-05-31')
    WHERE u.Flag_censure ='1'
    and u.Ref = '144'
    GROUP BY ref
    ref | users | cptotal|cppris|cpattente|cprefuse|cpvalid
    144 | xxxxx | 35.00 |14.00|48.0 |48.0 |112.0

    des lors que je laisse , que 2 conditions de jointures cela fonctionne.
    ref | users | cptotal|cpris |cprefuse|cpvalid
    144 | xxxxx | 35.00 | 14.00 |6.0 |14.0

    j'ai testé en modifiant le type de jointures , mais rien n'y fait ..

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut re suite...et fin
    j'ai change de méthode car les jointures , ce cumule dans certain cas ,

    j'ai utiliser la méthode CASE
    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
    SELECT
        u.ref,
        CONCAT(u.Nom, ' ', u.Prenom) AS NomPrenom,
        u.totalconges AS cptotal,
        u.congespris AS cppris,
        SUM (CASE WHEN c.refuse = '0' 
                         AND c.Flag_censure = '0'
                         and c.typeconges= '1' 
                         and c.datedebutconges >= '2010-06-01'
                         AND c.datefinconges <= '2011-05-31'
                         THEN c.nbjours 
                ELSE NULL END) AS cpattente,
        SUM (CASE WHEN c.refuse = '1' 
                         AND c.Flag_censure = '1'
                         and  c.typeconges  = '1' 
                         and c.datedebutconges >= '2010-06-01'
                         AND c.datefinconges <= '2011-05-31'
                         THEN c.nbjours 
                 ELSE NULL END) AS cprefuse,
        SUM (CASE WHEN c.refuse = '0'
                         AND c.Flag_censure = '1'
                         and c.typeconges= '1' 
                         and c.datedebutconges >= '2010-06-01'
                         AND c.datefinconges <= '2011-05-31'
                         THEN c.nbjours 
                 ELSE NULL END) AS cpvalid
    FROM users u
         LEFT JOIN conges c ON u.Email = c.mail_demandeur
    WHERE u.Flag_censure ='1'
    GROUP BY NOm , prenom;
    celle ci m'a permis d'avoir des résultats de SUM() cohérent et d'optimisé ma requête en terme de temps d'exécution.

    Encore merci Kain_Tn

    a cherché on fini toujours par trouvé....

  5. #5
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 287
    Points
    7 287
    Par défaut
    Il n'y a pas de quoi

    Par contre c'est étonnant, SUM() donne des résultats justes même si on somme un NULL? (et non pas un zéro?)

    Cordialement
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Les NULL sont ignorés dans les fonctions d'agrégation.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #7
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 287
    Points
    7 287
    Par défaut
    Au temps pour moi
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    }

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

Discussions similaires

  1. requete avec select imbriqué
    Par maub85 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 25/01/2012, 12h02
  2. optimisation de requête sql avec select imbriquées
    Par yassine_le_boss dans le forum SQL
    Réponses: 6
    Dernier message: 02/11/2010, 22h12
  3. Problème requete avec SELECT imbriqué
    Par Isiker dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2010, 16h44
  4. requete update avec select imbriqué
    Par mikees dans le forum SQL
    Réponses: 3
    Dernier message: 09/02/2009, 17h42
  5. Requete Update avec Select imbriqué: etrange resultat!
    Par corentone dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/08/2007, 15h05

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