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 :

Group By tout les 10 min


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut Group By tout les 10 min
    Bonjour,

    j'ai un tableau d'une colonne 'temps' qui m'indique l'heure a laquelle a été telechargée une video .
    2006-01-01 00:01:23
    TEMPS
    2006-01-01 00:02:45
    2006-01-01 00:12:89
    2006-01-01 00:17:26
    2006-01-01 00:19:08
    ...
    Je galere pour simuler une requete qui me permetrai de renvoyer le nombre de videos telecharger toutes les 10 minutes ou bien tout les 1/4 d'heures.
    Je penser utiliser date_add avec un interval mais apparement cette derniere fonction ne fait qu'une seule operation arithmetique

    donc un group by date_add( temps, interval 10 minute) ne fonctionne pas.

    Merci d'avance pour votre aide !

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Bon, allez, je vais me faire ma petite pub: je suis en train d 'écrire un article sur les fonctions de date en MySQL. C'est pas encore fini (ces 2 dernières semaines, j'ai eu d'autres choses à faire, j'ai pas encore mis à jour), ni même complètement testé et relu, mais tu trouveras des infos interressantes.

    Voici l'article en question:
    http://pcaboche.developpez.com/artic...ns_date_heure/

    Et ce qui devrait t'interesser, c'est l'étude de cas "Statistiques sur une période donnée". Bien sûr, il faudra adapter (en plus tu ne précises pas complètement ton besoin: toutes les 10 minutes, oui, mais sur quelle période?).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut
    Mes besoins sont variable,
    mais disons que la periode serait de un mois.
    LA finalité de la chose serait de faire des graphique.

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par clancy182
    Mes besoins sont variable,
    mais disons que la periode serait de un mois.
    D'accord.

    Citation Envoyé par clancy182
    La finalité de la chose serait de faire des graphique.
    Je m'en doutais un peu.

    Comme exposé dans l'articel, section "Statistiques sur une période donnée", le but c'est de :
    1) générer la liste des tranches pour lesquelles tu veux des statistiques
    2) faire un LEFT JOIN, un GROUP BY et un COUNT pour obtenir ces statistiques.

    J'espère que ceci est clair dans l'article, sinon je rajouterai une sous-partie pour expliquer cette démarche.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut
    oki merci, ca ma donné une idée a creuser
    reste plus qu'a essayer

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut
    bon, bon ,
    j'ai essayé de suivre ton exemple,
    alors ca marche bien pour les jours, les mois ou les années
    mais par contre des que j'affine l'intervalle au niveau des jours, ca me rend que des count égal à 1 :S

    SELECT DATE_ADD( '2005-12-01 00:00:00', INTERVAL nbr.n MINUTE ) AS min, COUNT( * )
    FROM nbr
    LEFT OUTER JOIN data_client ON DATE_FORMAT( data_client.timestamp_start, "%Y-%m-%d %H:%i" ) = DATE_ADD( '2005-12-01 00:00:00', INTERVAL nbr.n MINUTE )
    WHERE nbr.n
    BETWEEN 0 AND 10
    GROUP BY min


    je recherche le nombre de download du 12/01/05 a partir de minuit toutes les 10 minutes.
    et ca marche pas !!
    je suis un peu lost
    merci d'avance de votre aide

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Deux choses qui me paraissent bizarres: le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATE_FORMAT(data_client.timestamp_start,  "%Y-%m-%d %H:%i")
    où tu supprimes les secondes, et le:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE nbr.n BETWEEN 0 AND 10
    (là tu fais des stats sur les 10 premières minutes du jour)

    As-tu essayé quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
      DATE_ADD('2005-12-01 00:00:00',  INTERVAL nbr.n MINUTE)  AS min, COUNT(*) 
     
    FROM nbr
     
    LEFT OUTER JOIN data_client
    ON data_client.timestamp_start BETWEEN
    DATE_ADD('2005-12-01 00:00:00', INTERVAL nbr.n*10 MINUTE) AND
    DATE_ADD('2005-12-01 00:00:00', INTERVAL (nbr.n+1)*10 MINUTE)
     
    WHERE nbr.n BETWEEN 0  AND 143
    GROUP  BY min
    ?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut
    ca marche tres bien mais c tres lent avec un left outer join dans ce sens la
    avec un join sur la table nbr, c beaucoup plus rapide.
    je te remercie bcp en tout cas pour ta précieuse aide .
    ciao

  9. #9
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par clancy182
    ca marche tres bien mais c tres lent avec un left outer join dans ce sens la
    avec un join sur la table nbr, c beaucoup plus rapide.
    Oui, mais avec un LEFT JOIN, le sens dans lequel tu fais la jointure à de l'importance (sinon, tu n'auras pas les intervalles de temps pour lesquels aucun téléchrgement n'est effectué).

    Le mieux pour optimiser tout cela, c'est de faire des tables avec certains intervalles de temps déjà prêts à l'emplois (exemple: les intervalles de 10 min sur 24 heures), que tu n'aies plus qu'à faire des jointures en fonction des besoins. Ce qui prend du temps, c'est de tout regénérer à chaque fois...

    Citation Envoyé par clancy182
    je te remercie bcp en tout cas pour ta précieuse aide.
    ciao
    De rien. Je complèterai cette partie de mon article (article encore à l'état d'ébauche, même si assez avancé maintenant).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 32
    Points
    32
    Par défaut
    oué effectivement, il vaut mieux preparer des petits intervalles de temps pret à l'emploi.
    Bizarement, je recupere mes stats plus vite en faisant une boucle fort sur des petites requetes mysql sous php qu'en lancant une grosse requete sous mysql.
    Et quand je dis que ca prend du tps... pour recuperer les stats sur une journée, il me faut 2 h
    merci encore.

  11. #11
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Oui, en effet, c'est très très long... Tu dois avoir énormément de stats et MySQL doit ramer pour faire le GROUP BY (surtout que MySQL ne peut pas s'aider d'index sur ton champ date). A l'inverse, faire des SELECT COUNT(*) n'est pas très couteux (il faut juste reparcourir la table à chaque fois). Donc ce résultat s'explique...

    Si il est beaucoup moins couteux de faire une multitude de SELECT dans une boucle for, alors va pour cette solution, d'autant qu'il est plus facile alors de paramètrer le début et la fin de l'intervalle ainsi que le pas d'incrémentation. Je prends note...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. [AC-2010] exécution automatique de requêtes toutes les 30 min
    Par Pdg6704 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/06/2015, 13h00
  2. Envoyer un fichier par FTP toutes les 2 min en Java
    Par stpaul04 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 05/02/2014, 01h12
  3. Réponses: 4
    Dernier message: 11/06/2013, 16h22
  4. Faire une taches toutes les x mins
    Par chepac dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 12/05/2010, 14h45
  5. [WD10]Executer une tache toute les x min, sec, etc.
    Par tunidesign dans le forum WinDev
    Réponses: 2
    Dernier message: 11/02/2008, 03h31

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