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 :

[mysql 5] requete avec count+ having + group by


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut [mysql 5] requete avec count+ having + group by
    Bonjour,

    j'aimerai j'ai une base de données composé d'une table user et de x tables d'archive de sorties(une table par année).
    dans les table d'archive de sorties, j'enregistre des information sur la date de sortie et , l'id du user qui est sorti. Je cherche a retrouver les users qui sont sont sortie entre 2 et 10 fois dans une période définie.

    voila a requête que j'ai mis en place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT u.nom,
    ( COUNT(a1.id_user) + COUNT(a2.id_user)) AS nb_sortie
      FROM user u 
       LEFT JOIN a_2007 a1 ON (a1.id_user=u.id_user)  AND  a1.date_sortie>='2007-02-1'   
       LEFT JOIN a_2008 a2 ap5 ON (a2.id_user=u.id_user) AND a2.date_sortie<='2008-09-31'  
       GROUP BY  a1.id_user, a2.id_user
    HAVING (nb_sortie>=2 AND nb_sortie<=10)
    ORDER By nb_sortie desc
    cette requête marche sur 2 anq mais au delà les temps de calcul sont énormes, y a t'il un moyen d'optimiser ce type de recherche?

    Merci d'avance pour la réponse

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je ne sais pas si ça économisera grand chose, mais tu peux déjà écrire la clause HAVING de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING nb_sortie BETWEEN 2 AND 10
    Sinon, mélanger les critères de jointures avec les critères de filtre ne me semble pas un bon procédé, même si je ne saurais affirmer que cela ralentit la requête.
    Disons que je trouve plus lisible d'ajouter une clause WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE a1.date_sortie>='2007-02-1' AND a2.date_sortie<='2008-09

  3. #3
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    merci pour cette réponse, effectivement, passer la date dans la condition where me fait gagner du temps, mais je n'arrive pas au résultat quand je mets sur 4 ou 5 ans.. le temps est vraiment trop long... faudrait il passer par la création de table temporaire?

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Tu penses à une table temporaire qui regrouperait toute les lignes concernées avec UNION entre les SELECT ?
    Tu ne perds rien à essayer. Reste à savoir si le temps de la création de la table temporaire ajouter à la requête sur la table temporaire sera plus court, sachant que le travail sur table temporaire se fait sans index. Ça risque d'être très pénalisant pour le GROUP BY et le ORDER BY.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    je viens de m'apercevoir surtout que les ressauts sont faux si je les passe sur 2 années de suite
    par exemple le count de l'année 2007 uniquement sur un user me donne 9 et celui sur l'année 2008 uniquement me donne 21. je m'attend a ce que la somme des 2 me donne 30 et pourtant j'obtiens 378 a savoir la somme des combinaison de la permière table * la seconde et inversement) (9*21)
    Comment faire pour éviter cela?

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Maintenant que tu le dis, j'imagine que, pour chaque année que tu ajoutes en jointure, ça doit engendrer une sorte de produit cartésien avec la jointure précédente, d'où l'accroissement exponentiel des lignes comptées.
    Il semble donc qu'il faille passer par des SELECT en UNION sur lesquels se ferait le comptage en GROUP BY.
    Quant aux performances......

    PS tu devrais ôter le [Résolu] de ton post.

    PS bis : Le dendrocopos minor, j'en vois jamais en Bretagne, dommage, ça a l'air adorable comme volatile.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par epeichette Voir le message
    je viens de m'apercevoir surtout que les ressauts sont faux si je les passe sur 2 années de suite
    Ton GROUP BY est très étrange, ce ne serait pas plutôt :


  8. #8
    Membre régulier
    Inscrit en
    Juin 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 242
    Points : 94
    Points
    94
    Par défaut
    oups merci, un copier/coller mal a propos. ca marche maintenant :-)

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

Discussions similaires

  1. Requete avec count/group/average
    Par Devko dans le forum Linq
    Réponses: 2
    Dernier message: 12/03/2014, 12h57
  2. requete select avec count et group by
    Par paco503 dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/05/2013, 18h42
  3. Comment optimiser une Requete avec Count ?
    Par tavarlindar dans le forum Requêtes
    Réponses: 15
    Dernier message: 09/02/2007, 22h19
  4. [SQL Server] Requete avec MAX et group by
    Par joKED dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/01/2007, 14h00
  5. Requete avec max et group by
    Par Maxime555 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2006, 12h48

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