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 :

Possible de regrouper les requêtes ?


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut Possible de regrouper les requêtes ?
    Bonjour,

    j'ai une requête qui permet de me récupérer quelques infos sur un utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.ID_USER, u.EMAIL, e.LDAP
        FROM t_users AS u LEFT JOIN t_entites AS e
                ON u.ID_ENTITE = e.ID_ENTITE
       WHERE u.IS_SUPERVISEUR = '1'
    GROUP BY u.ID_USER, u.EMAIL, e.LDAP
    ORDER BY u.EMAIL;
    Pour l'instant mon algo fait que je parcours chaque enregistrement (il y en a 92 en tout), et pour chacun, je lance 2 requêtes :
    1ère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT COUNT(i.ID_IDEE) AS NB_IDEES
      FROM t_idees AS i INNER JOIN t_idees_dates AS d
              ON i.ID_IDEE = d.ID_IDEE
     WHERE ((i.ID_SUPERVISEUR = 10897 AND i.ID_STATUT = 2)
            OR(i.ID_EXPERT IN (SELECT ID_USER
                                 FROM t_users
                                WHERE ID_SUPERVISEUR = 10897)
               AND i.ID_STATUT BETWEEN 2 AND 4))
           AND i.ABANDON = 1;
    2ème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT ID_STATUT, count(i.ID_IDEE) AS NB_IDEES
        FROM t_idees AS i INNER JOIN t_idees_dates AS d
                ON i.ID_IDEE = d.ID_IDEE
       WHERE i.ID_EXPERT IN (SELECT ID_USER
                               FROM t_users
                              WHERE ID_SUPERVISEUR = 10897)
             AND ((i.ID_STATUT IN (2, 3, 4) AND i.ABANDON <> 1)
                 OR(i.ID_STATUT IN (5, 6, 7, 8) AND i.CLOTURE <> 1))
    GROUP BY i.ID_STATUT
    ORDER BY i.ID_STATUT ASC;
    dans lesquelles ID_SUPERVISEUR est égal à l'ID_USER de la 1ère requête. Et ma page est super longue à s'afficher du coup, est-ce que vous pensez que c'est possible de regrouper les 3 requêtes ? Je continue à chercher en attendant..

    Merci !

  2. #2
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Personne n'a une idée ?
    Au moins pour regrouper les 2 premières requêtes..j'ai essayé ç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
    18
    19
    SELECT u.ID_USER,
             u.EMAIL,
             e.LDAP,
             (SELECT COUNT(i.ID_IDEE) AS NB_IDEES
                FROM t_idees AS i INNER JOIN t_idees_dates AS d
                        ON i.ID_IDEE = d.ID_IDEE
               WHERE ((i.ID_SUPERVISEUR = u.ID_USER AND i.ID_STATUT = 2)
                      OR(EXISTS
                            (SELECT u2.ID_USER
                               FROM t_users u2
                              WHERE i.ID_EXPERT = u2.ID_USER
                                    AND u2.ID_SUPERVISEUR = u.ID_USER)
                         AND i.ID_STATUT BETWEEN 2 AND 4))
                     AND i.ABANDON = 1)
        FROM t_users AS u LEFT JOIN t_entites AS e
                ON u.ID_ENTITE = e.ID_ENTITE
       WHERE IS_SUPERVISEUR = '1'
    GROUP BY u.ID_USER, u.EMAIL, e.LDAP
    ORDER BY EMAIL
    mais c'est 10 fois trop long à s'exécuter !!

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ai du mal à comprendre ce que tu cherches à obtenir par cette requête.
    Peux-tu exprimer le besoin en français STP ?

  4. #4
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    la 2ème requête sert à compter le nombre d'idées d'un superviseur "A" (qui vient de la 1ère requête) + le nombre d'idées des experts qui ont pour superviseur "A", je peux pas faire plus clair

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Dans la première requête, le GROUP BY est inutile puisqu'il n'y a pas de fonction d'agregation. S'il peut y avoir plusieurs fois le même couple {user, ldap}, mettre un SELECT DISTINCT.

    la 2ème requête sert à compter le nombre d'idées d'un superviseur "A" (qui vient de la 1ère requête) + le nombre d'idées des experts qui ont pour superviseur "A",
    Je me sers de ta deuxième requête...

    Nb d'idées par superviseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT u.ID_USER AS id_superviseur, 
      u.EMAIL AS adrel_superviseur,
      e.LDAP AS ldap_superviseur, 
      COUNT(i.*) AS nb_idees_superviseur
    FROM t_users AS u 
    LEFT JOIN t_entites AS e ON u.ID_ENTITE = e.ID_ENTITE
    LEFT JOIN t_idees AS i ON i.ID_SUPERVISEUR = u.ID_USER
      AND i.ID_STATUT = 2
      AND i.ABANDON = 1
    WHERE u.IS_SUPERVISEUR = '1'
    GROUP BY u.ID_USER, u.EMAIL, e.LDAP
    ORDER BY u.EMAIL
    Nb d'idées des experts de chaque superviseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT u.ID_USER AS id_superviseur,
      u.EMAIL AS adrel_superviseur,
      u2.ID_USER AS id_expert,
      e.LDAP AS ldap_superviseur,
      COUNT(i2.*) AS nb_idees_expert
    FROM t_users AS u 
    LEFT JOIN t_entites AS e ON u.ID_ENTITE = e.ID_ENTITE
    LEFT JOIN t_users AS u2 ON u2.ID_SUPERVISEUR = u.ID_USER
      LEFT JOIN t_idees AS i2 ON i2.ID_EXPERT = u2.ID_USER
        AND i2.ID_STATUT BETWEEN 2 AND 4
        AND i2.ABANDON = 1
    WHERE u.IS_SUPERVISEUR = '1'
    GROUP BY u.ID_USER, u.EMAIL, e.LDAP, u2.ID_USER
    Par contre comme dans ta deuxième requête il y a i.ABANDON = 1 et que dans les suivantes ça change, je suis un peu paumé pour la suite, surtout que tu comptes cette fois par statut.

    J'espère t'avoir mis sur la piste.

  6. #6
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    bon en fait ces 2 requêtes (Nb d'idées par superviseur et Nb d'idées des experts de chaque superviseur) sont aussi super lentes je laisse tomber, tant pis la page sera lente.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Est-ce que tes tables sont correctement indexées ?
    Notamment toutes les clés étrangères.

  8. #8
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    bein oui je pense..voilà les index (je ne liste volontairement pas tout) :
    Table t_users
    1. ID_USER (PRIMARY)
    2. EMAIL
    3. ID_ENTITE
    4. IS_SUPERVISEUR
    5. ID_SUPERVISEUR


    Table t_entites
    1. ID_ENTITE (PRIMARY)
    2. LDAP


    Table t_idees
    1. ID_SUPERVISEUR
    2. ID_STATUT
    3. ABANDON
    4. ID_EXPERT

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Bizarre que ce soit lent !
    Quel volume de données ?

    On peut avoir le plan d'exécution des requêtes (EXPLAIN la requête) ?

  10. #10
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    voir les pièces jointes pour les plans d'exécution..

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Le plus embêtant est la première ligne de chaque plan de requête mais cela semble normal à cause du GROUP BY et de l'ORDER BY.
    Et le volume de données est plutôt faible.

    Peut-être ton serveur est-il faiblement dimensionné ?

  12. #12
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    ah bein là je ne peux rien changer
    bon bein tant pis alors, merci quand même CinePhil de ta patience

Discussions similaires

  1. [SQL] regrouper les requêtes en 1 fichier include ?
    Par grinder59 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 27/01/2012, 13h00
  2. Opérations "Regroupement" et "Somme" dans les requêtes
    Par louisbru dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 27/02/2009, 19h29
  3. [A-03] SQL : requête de synthese, regrouper les petites valeurs
    Par yupyupxav dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/12/2008, 11h29
  4. requête dont je n'arrive pas à regrouper les résultats
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/02/2008, 11h05
  5. Regrouper les résultats de 3 requêtes en une seule
    Par getz85 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 28/01/2008, 18h39

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