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 :

Requete "Count" avec un having.


Sujet :

Requêtes MySQL

  1. #1
    Rédacteur
    Avatar de BrYs
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 014
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 014
    Points : 3 522
    Points
    3 522
    Par défaut Requete "Count" avec un having.
    Bonjour,
    ayé, je sèche sur une requête, qui me parait pourtant simple, mais bon.

    En gros je cherche à avoir le le nombre d'enregistrement renvoyé en tout.
    Le fait que ma requete possède un having, mon resultat est le nombre d'enregistrement traité par ligne.

    A mon avis c'est super pas clair ce que je viens de dire

    Avec la requete ça sera plus simple :

    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
    SELECT 
    	count(r.id_regroupement) as nb
    FROM 
    	t_sites s,
    	t_regroupements r,
    	t_clients c
    WHERE 
    	r.id_regroupement = s.id_regroupement 
    AND 
    	r.id_client = c.id_client
    AND 
    	r.statut='actif' AND s.statut='actif' 
    AND 
    	(r.flag_welcome & 1) = 0
    AND 
    	(r.flag_welcome & 2) = 0 
    AND 
    	(r.flag_welcome & 4) = 0
    GROUP BY 
    	r.id_regroupement
    HAVING
    	MIN(date_welcome) LIKE '2006-01%'
    Sans le count, ma requete fonctionne très bien (quoi que un peu lente), mais avec le count elle me renvoi :

    nb
    ------
    1
    1
    1
    1
    1
    1
    Alors que j'aimerais

    nb
    ------
    6
    Ce qui n'arrange rien est que ma version de Mysql est 4.0.17 (donc pas de requetes imriqués)

    Merci d'avance pour vos suggestions.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    oula c'est quoi ces jointures croisées en vrac ? deux petites jointures externes (ou interne selon la structure de tes tables) serait tellement mieux ^^

    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
    SELECT 
    	COUNT(r.id_regroupement) as nb
    FROM 
    	t_sites s
            INNER JOIN t_regroupements r
               ON r.id_regroupement = s.id_regroupement 
    	INNER JOIN t_clients c
               ON r.id_client = c.id_client
    WHERE 
    	r.statut='actif' AND s.statut='actif' 
    AND 
    	(r.flag_welcome & 1) = 0
    AND 
    	(r.flag_welcome & 2) = 0 
    AND 
    	(r.flag_welcome & 4) = 0
    GROUP BY 
    	r.id_regroupement
    HAVING
    	MIN(date_welcome) LIKE '2006-01%'
    ensuite, le problème vient du fait que le GROUP BY va se faire à la fois sur le MIN et sur le COUNT....

    et sans sous-requêtes, il va falloir passer par une table temporaire, ou alors par un langage externe (avantage, compter le nombre de resultat est une opération triviale )

    Dans tous les cas, tu pourras retirer le COUNT

  3. #3
    Rédacteur
    Avatar de BrYs
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 014
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 014
    Points : 3 522
    Points
    3 522
    Par défaut
    Citation Envoyé par Swoög
    Salut !

    oula c'est quoi ces jointures croisées en vrac ? deux petites jointures externes (ou interne selon la structure de tes tables) serait tellement mieux ^^

    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
    SELECT 
    	COUNT(r.id_regroupement) as nb
    FROM 
    	t_sites s
            INNER JOIN t_regroupements r
               ON r.id_regroupement = s.id_regroupement 
    	INNER JOIN t_clients c
               ON r.id_client = c.id_client
    WHERE 
    	r.statut='actif' AND s.statut='actif' 
    AND 
    	(r.flag_welcome & 1) = 0
    AND 
    	(r.flag_welcome & 2) = 0 
    AND 
    	(r.flag_welcome & 4) = 0
    GROUP BY 
    	r.id_regroupement
    HAVING
    	MIN(date_welcome) LIKE '2006-01%'
    ensuite, le problème vient du fait que le GROUP BY va se faire à la fois sur le MIN et sur le COUNT....

    et sans sous-requêtes, il va falloir passer par une table temporaire, ou alors par un langage externe (avantage, compter le nombre de resultat est une opération triviale )

    Dans tous les cas, tu pourras retirer le COUNT
    Ben j'avais prévu les table temporaire. (je sentais que j'avais pas le choix)
    Pour le coup des jointures, il me semblait avoir lu que cela ne changeait rien du tout !

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    d'un point de vue resultat peut-être pas, mais d'un point de vue performances et sémantique si, parce que le type de filtrage effectué sur les données n'est pas le même, dans ce cas là, c'est plus performant

  5. #5
    Rédacteur
    Avatar de BrYs
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 014
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 014
    Points : 3 522
    Points
    3 522
    Par défaut
    Citation Envoyé par Swoög
    d'un point de vue resultat peut-être pas, mais d'un point de vue performances et sémantique si, parce que le type de filtrage effectué sur les données n'est pas le même, dans ce cas là, c'est plus performant
    Sur la semantique nous sommes d'accord ... mais le fait est qu'en pratique ta requete mets 2 fois plus de temps .

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par BrYs
    Sur la semantique nous sommes d'accord ... mais le fait est qu'en pratique ta requete mets 2 fois plus de temps .
    première fois que je vois ça c'est pas normal... lol

    Bah... tant pis pour la sémantique alors ... mais j'comprends pas...

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

Discussions similaires

  1. [SQL2K]Requete sur une chaine avec une ou plusieurs quote
    Par tazamorte dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/04/2007, 09h22

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