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 :

[Requête] nombre d'éléments d'un type donné par jour


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de Konrad Florczak
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 242
    Par défaut [Requête] nombre d'éléments d'un type donné par jour
    Bonjour j'ai un table log4j qui contient comme variable :
    time date
    warning char(5)
    class varchar(50)
    message text
    environment varchar(10)
    server_name varchar(20)
    id bigint(20)


    j'aimerais constituer un tableau qui me fasse classer par jour le type de warning (debut, info, warn, error, fatal). J'arrive a créer le tableau je ne sais afficher que la somme sur un ensemble de jour et pas par jour. Pourriez vous m'aider. Je ne suis pas très doué en SQL et je ne vois pas comment le realiser sans les boucles :

    Voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select time as day,
    (select count(*) from log4j where warning='debug') as debug,
    (select count(*) from log4j where warning='info') as info,
    (select count(*) from log4j where warning='warn') as warn ,
    (select count(*) from log4j where warning='error') as error,
    (select count(*) from log4j where warning='fatal') as fatal
    from log4j
    where time BETWEEN '2006-10-01' AND '2006-10-31'
    group by time;
    et voila ce qui s'affiche
    +------------+-------+------+------+-------+-------+
    | day | debug | info | warn | error | fatal |
    +------------+-------+------+------+-------+-------+
    | 2006-10-03 | 0 | 3 | 0 | 0 | 3 |
    | 2006-10-04 | 0 | 3 | 0 | 0 | 3 |
    | 2006-10-10 | 0 | 3 | 0 | 0 | 3 |
    | 2006-10-12 | 0 | 3 | 0 | 0 | 3 |
    | 2006-10-14 | 0 | 3 | 0 | 0 | 3 |
    | 2006-10-18 | 0 | 3 | 0 | 0 | 3 |
    +------------+-------+------+------+-------+-------+
    alors que cela devrait etre :
    +------------+-------+------+------+-------+-------+
    | day | debug | info | warn | error | fatal |
    +------------+-------+------+------+-------+-------+
    | 2006-10-03 | 0 | 1 | 0 | 0 | 1 |
    | 2006-10-04 | 0 | 1 | 0 | 0 | 0 |
    | 2006-10-10 | 0 | 0 | 0 | 0 | 1 |
    | 2006-10-12 | 0 | 1 | 0 | 0 | 0 |
    | 2006-10-14 | 0 | 0 | 0 | 0 | 1 |
    | 2006-10-18 | 0 | 0 | 0 | 0 | 0 |
    +------------+-------+------+------+-------+-------+
    Merci pour vos réponses, je ne sais plus ou donner de la tete



    [Titre édité par Maximilian]

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    J'ai l'impression que les requètes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM log4j WHERE warning=
    sont assimilées à des ss-requètes, ce qui explique les '3' obtenus...

    De fait, syntaxiquement, les SELECT "intermédiaires" seraient à supprimer et à remplacer par ..... un SUM ?

  3. #3
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Salut,

    Je n'ai pas mieux en stock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT time AS day,
      SUM(IF(warning='debug',1,0)) AS debug,
      SUM(IF(warning='info',1,0)) AS info,
      SUM(IF(warning='warn',1,0)) AS warn,
      SUM(IF(warning='error',1,0)) AS error,
      SUM(IF(warning='fatal',1,0)) AS fatal
    FROM log4j 
    WHERE time BETWEEN '2006-10-01' AND '2006-10-31'
    GROUP BY time;

  4. #4
    Membre éprouvé
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Par défaut
    Bonjour,

    Et 1 petit ''CASE'' en plus et tu devrais obtenir ce que tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT time AS day,
    SUM (CASE WHEN warning='debug' THEN 1 ELSE 0) AS debug,
    SUM (CASE WHEN warning='info' THEN 1 ELSE 0) AS info ,
    (...)
    FROM log4j
    WHERE time BETWEEN '2006-10-01' AND '2006-10-31'
    GROUP BY time;
    [edit] grrrr..illé. [/edit]

  5. #5
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Citation Envoyé par TheLeadingEdge
    [edit] grrrr..illé. [/edit]
    Certes mais votre syntaxe SQL est plus normalisée et donc plus portable. Bref privilégiez la syntaxe de TheLeadingEdge, même si sur MySQL celle de Biglo est parfaitement juste.

    Il me semble en plus qu'une fonction (IF) est toujours plus lente qu'un CASE WHEN (en raison de l'affectation mémoire des arguments de la fonction)
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  6. #6
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Citation Envoyé par qi130
    J'ai l'impression que les requètes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM log4j WHERE warning=
    sont assimilées à des ss-requètes, ce qui explique les '3' obtenus...

    De fait, syntaxiquement, les SELECT "intermédiaires" seraient à supprimer et à remplacer par ..... un SUM ?
    Ce SONT des sous-requêtes, et en tant que telles elles comptent pour toute la table. Pour que la méthode soit viable il faudrait donner des alias et lier les sous-requêtes à la requête mère par la date (du genre 'WHERE papa.time=moi.time AND [...]').

    Ca me semble bien plus efficace et sympa (et acceptable en pre MySQL5) avec les SUM.

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

Discussions similaires

  1. Compter le nombre de visite par jour
    Par Are-no dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/02/2008, 16h37
  2. Requête simple : nombre de commande par jour
    Par morgan4 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/12/2007, 16h43
  3. Nombre de messages par jour
    Par genova dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/09/2006, 10h36
  4. [SQL] Nombre de connexion par jour
    Par Oberown dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/10/2005, 15h52
  5. [Petite requête] Nombre de transactions par jour
    Par Braim dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/04/2003, 10h53

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