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 :

Equivalent de Max(COUNT(*))


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Par défaut Equivalent de Max(COUNT(*))
    Bonsoir,

    MySQL 5.0

    J'ai une table statistique très simple composée de deux champs :
    idNomenclature (varchar(18) et Index)
    date (datetime)

    Aucun des champs ne doit comporter une clé primaire exact ?

    Je souhaite récuperer le nombre de visite par jour de la semaine, j'ai donc fait cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $requete="SELECT LEFT(date, 10), COUNT(*) 
                    FROM `statistique` 
                    WHERE LEFT(date, 10) 
                    IN (CURRENT_DATE(), (CURRENT_DATE() - INTERVAL 1 DAY), (CURRENT_DATE() - INTERVAL 2 DAY), (CURRENT_DATE() - INTERVAL 3 DAY), (CURRENT_DATE() - INTERVAL 4 DAY), (CURRENT_DATE() - INTERVAL 5 DAY), (CURRENT_DATE() - INTERVAL 6 DAY)) 
                    GROUP BY LEFT(date, 10) 
                    ORDER BY LEFT(date, 10) DESC";
        $res=mysql_query($requete, $link) or die(mysql_error());
    Je n'arrive pas à utiliser BETWEEN donc j'ai utilisé IN.

    Ensuite, je souhaiterai récupérer le jour et le nombre de visite du jour de la semaine qui a eu le plus de visite.
    2 solutions se sont présentées :
    • MAX(COUNT(*))
      Qui visiblement ne fonctionne pas.
    • Sous-requete
      Aucun succès.
    Si vous aviez des pistes ou des optimisations à apporter à la requete, cela m'aiderait beaucoup. Merci.

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

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

    Alors pour la première question :
    Citation Envoyé par Naktan
    J'ai une table statistique très simple composée de deux champs :
    idNomenclature (varchar(18) et Index)
    date (datetime)

    Aucun des champs ne doit comporter une clé primaire exact ?
    Pour quelle raison !?
    Dans la mesure du possible, une table DOIT TOUJOURS posséder une clée primaire (sauf les tables de liaison par exemple, et encore, dans ce cas, on peut mettre la clée primaire sur la totalité de l'enregistrement, bien que ça puisse être très pénalisant au niveau des performances)
    Cela permet d'identifier une ligne de manière unique...

    Citation Envoyé par Naktan
    Je n'arrive pas à utiliser BETWEEN donc j'ai utilisé IN.
    Je ne suis pas sûr que ça marche pour les dates, mais essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT LEFT(date, 10), COUNT(*) 
                    FROM `statistique` 
                    WHERE LEFT(date, 10) 
                    BETWEEN (CURRENT_DATE() - INTERVAL 6 DAY) AND (CURRENT_DATE()) 
                    GROUP BY LEFT(date, 10) 
                    ORDER BY LEFT(date, 10) DESC
    à noter : il y a tout de même une différence entre IN et BETWEEN dans ce cas : IN ne prendra que les dates qui tombes PILE sur "CURRENT_DATE() - INTERVAL N DAY"

    Citation Envoyé par Naktan
    Ensuite, je souhaiterai récupérer le jour et le nombre de visite du jour de la semaine qui a eu le plus de visite.
    heu je dis ça juste comme ça mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT LEFT(date, 10), COUNT(*) AS Count
                    FROM `statistique` 
                    WHERE LEFT(date, 10) 
                    IN (CURRENT_DATE(), (CURRENT_DATE() - INTERVAL 1 DAY), (CURRENT_DATE() - INTERVAL 2 DAY), (CURRENT_DATE() - INTERVAL 3 DAY), (CURRENT_DATE() - INTERVAL 4 DAY), (CURRENT_DATE() - INTERVAL 5 DAY), (CURRENT_DATE() - INTERVAL 6 DAY)) 
                    GROUP BY LEFT(date, 10) 
                    ORDER BY Count DESC
                    LIMIT 1
    ça marche pas ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Par défaut
    Je vous remercie pour votre réponse,

    Dans la mesure du possible, une table DOIT TOUJOURS posséder une clée primaire.
    Cela permet d'identifier une ligne de manière unique...
    Justement, un date est de paire avec plusieurs idNomenclature et un idNomenclature avec plusieurs dates. Aucun champ n'est unique, et je pense qu'il y a aucun interet à introduire un id propre à la table.

    SELECT LEFT(date, 10), COUNT(*)
    FROM `statistique`
    WHERE LEFT(date, 10)
    BETWEEN (CURRENT_DATE() - INTERVAL 6 DAY) AND (CURRENT_DATE())
    GROUP BY LEFT(date, 10)
    ORDER BY LEFT(date, 10) DESC
    Ca fonctionne parfaitement, mais j'avoue ne pas comprendre, j'avais essayé celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT LEFT(date, 10), COUNT(*) 
                    FROM `statistique` 
                    WHERE LEFT(date, 10) 
                    BETWEEN (CURRENT_DATE()) AND (CURRENT_DATE() - INTERVAL 6 DAY) 
                    GROUP BY LEFT(date, 10) 
                    ORDER BY LEFT(date, 10) DESC
    Et celà ne me retourné aucun résultat...

    SELECT LEFT(date, 10), COUNT(*) AS Count
    FROM `statistique`
    WHERE LEFT(date, 10)
    IN (CURRENT_DATE(), (CURRENT_DATE() - INTERVAL 1 DAY), (CURRENT_DATE() - INTERVAL 2 DAY), (CURRENT_DATE() - INTERVAL 3 DAY), (CURRENT_DATE() - INTERVAL 4 DAY), (CURRENT_DATE() - INTERVAL 5 DAY), (CURRENT_DATE() - INTERVAL 6 DAY))
    GROUP BY LEFT(date, 10)
    ORDER BY Count DESC
    LIMIT 1
    Arg, je n'avais pas pensé à utiliser LIMIT 1, merci beaucoup. N'y a t-il pas moyen d'intégrer cette requete à la précédente ? Afin de gagner en ressource.

    Merci beaucoup et très bonne journée

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par Naktan
    Justement, un date est de paire avec plusieurs idNomenclature et un idNomenclature avec plusieurs dates. Aucun champ n'est unique, et je pense qu'il y a aucun interet à introduire un id propre à la table.
    Effectivement, là t'es dans un cas équivalent à une table de liaison... ça servirait pas à grand chose de mettre une clé prmiaire...


    Citation Envoyé par Naktan
    Ca fonctionne parfaitement, mais j'avoue ne pas comprendre, j'avais essayé celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT LEFT(date, 10), COUNT(*) 
                    FROM `statistique` 
                    WHERE LEFT(date, 10) 
                    BETWEEN (CURRENT_DATE()) AND (CURRENT_DATE() - INTERVAL 6 DAY) 
                    GROUP BY LEFT(date, 10) 
                    ORDER BY LEFT(date, 10) DESC
    Et celà ne me retourné aucun résultat...
    c'est parce que BETWEEN cherche entre une borne minimal et une borne maximal... dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN (CURRENT_DATE()) AND (CURRENT_DATE() - INTERVAL 6 DAY)
    , la borne "minimal" de between (current_date) est supérieur (se situe après puisqu'on par de dates) à la borne maximale (current_date() - 6jours) donc il n'y a rien entr les deux

    Citation Envoyé par Naktan
    Arg, je n'avais pas pensé à utiliser LIMIT 1, merci beaucoup. N'y a t-il pas moyen d'intégrer cette requete à la précédente ? Afin de gagner en ressource.
    Si parfaitement, il te suffit de modifier le ORDER et d'ajouter le LIMIT

    Citation Envoyé par Naktan
    Merci beaucoup et très bonne journée
    De rien, bonne journée toi aussi ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 58
    Par défaut
    , la borne "minimal" de between (current_date) est supérieur (se situe après puisqu'on par de dates) à la borne maximale (current_date() - 6jours) donc il n'y a rien entr les deux
    Effectivement, j'ai manqué de rigeur en lisant la doc.

    Si parfaitement, il te suffit de modifier le ORDER et d'ajouter le LIMIT
    Je me suis mal exprimé, le soucis serait de retourner cette ligne en plus du résultat de la première requete. Selon moi, en une requete c'est pas possible, mais je préfére avoir confirmation.

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Arf, effectivement...

    là, ça va pas être possible en une seul requête... :\
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

Discussions similaires

  1. equivalent select max(donnee)
    Par christel1982 dans le forum Deski
    Réponses: 3
    Dernier message: 29/12/2006, 17h00
  2. comment calculer Max(count(*))
    Par w@ssim dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/11/2006, 09h27
  3. Réponses: 3
    Dernier message: 24/06/2006, 15h05
  4. SQL et MAX(count(*))
    Par zouaoui dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/05/2006, 13h15
  5. remplacer max(count())
    Par atog dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/01/2005, 00h01

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