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 avec sous requete tourne sans fin


Sujet :

Requêtes MySQL

  1. #1
    Invité
    Invité(e)
    Par défaut Requete avec sous requete tourne sans fin
    Bonjour,

    je suis en train de faire une requête SQL qui n'en finit pas de s'exécuter...

    J'ai une table md_donnees dans laquelle je stocke des données entrées par l'utilisateur
    je veux calculer le nombre de données que l'utilisateur à ajouté au cours des dernières 24h (ca j'ai réussi à faire) MAIS je ne veux pas prendre en compte les données qui ont pu être déjà ajoutée au cours des dernières 48h...

    en gros, si l'user, a ajouté toto hier, et a rajouté toto aujourd'hui, toto ne doit pas être compté dans la requête

    voilà ma requête (les timestamp sont en dur pour les tests) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT COUNT(DISTINCT donnee),idMembre 
    FROM 'md_donnees' as donnees 
    WHERE 'date'>1283089919 
    AND donnee
    NOT IN (SELECT donnee
               FROM md_donnees as olddonnees
               WHERE olddonnees.idMembre=donnees.idMembre 
               AND 'date'>(1283089919-172800) 
               AND date<1283089919 
               AND olddonnees.donnee=donnees.donnee)
    GROUP BY idMembre


    si je rajoute après le NOT IN() un idMembre=2, ca marche, mais si je ne précise pas l'id du membre ca s'exécute sans fin...


    merci de votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ta requête ne devrait carrément pas fonctionner !

    Tu as entouré le nom de la table md_donnees par des apostrophes, ce que MySQL comprendra comme une chaîne de caractères et non pas comme le nom d'une table !

    Idem pour la colonne date qui est d'ailleurs un mauvais choix de nom puisque c'est un mot du langage SQL ! Entoure ce mauvais nom avec des apostrophes inversées (Ctrl+7 sur un clavier français). C'est inutile pour le nom de la table.

    Bizarres les valeurs de tes TIMESTAMP !

    D'après la doc MySQL :
    Les colonnes TIMESTAMP sont affichées dans le même format que les valeurs des colonnes DATETIME.
    Et le type DATETIME s'écrit de la façon suivante : 'aaaa-mm-jj hh:mm:ss'. C'est quand même plus facile à lire !

    Plutôt que > et <, utilise plutôt BETWEEN.

    je veux calculer le nombre de données que l'utilisateur à ajouté au cours des dernières 24h (ca j'ai réussi à faire) MAIS je ne veux pas prendre en compte les données qui ont pu être déjà ajoutée au cours des dernières 48h...

    en gros, si l'user, a ajouté toto hier, et a rajouté toto aujourd'hui, toto ne doit pas être compté dans la requête
    Ton unité de recherche est la journée ou les dernières 24 heures (par exemple de 10:58:00 hier à 10:57:59 aujourd'hui) ?

    NOT EXISTS est préférable à NOT IN.

    Et bien sûr il faut que la table soit correctement indexée, notamment la colonne `date`.

    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT COUNT(DISTINCT d.donnee), d.idMembre 
    FROM md_donnees AS d 
    WHERE d.`date` BETWEEN DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 HOUR) AND CURRENT_TIMESTAMP 
        AND NOT EXISTS (
            SELECT *
            FROM md_donnees AS d2
            WHERE d2.idMembre = d.idMembre 
                AND d2.donnee = d1.donnee
                AND d2.`date` BETWEEN DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 48 HOUR) AND DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 HOUR
        )
    GROUP BY idMembre
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Invité
    Invité(e)
    Par défaut
    merci pour la réponse

    syntaxiquement elle est bonne puisque pma me l'éxecute ^^

    alors les guillemets je sais pas ce qu'elles foutent là Oo à l'origine c'était des ` mais je ne sais à quel moment elles se sont tranformées en ' d'ailleurs pour le nom de la table c'est PMA qui les avaient mises ^^ sinon moi j'en met jamais

    les timestamp sont des "vrais" timestamp : des secondes que je stocke en int
    oui c'est bien sur les dernière 24h

    j'avais essayé le not exists mais ca marchait pas mieux ^^

    par contre pourquoi veux tu que j'indexe le champ date ?

    edit :

    bon j'ai executer ta requ (dont j'ai corrigé 2 coquilles, et mis les date en timestamp unix) et le résultat est le même que ma requete ^^
    ca se lance, mais l'execution ne se termine jamais

    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
    SELECT COUNT(DISTINCT d.donnee), d.idMembre 
    FROM md_donnees AS d 
    WHERE d.`date` 
      BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 HOUR)) 
      AND UNIX_TIMESTAMP(CURRENT_TIMESTAMP) 
    AND NOT EXISTS ( 
        SELECT * 
        FROM md_donnees AS d2 
        WHERE d2.idMembre = d.idMembre 
     AND d2.donnee = d.donnee 
     AND d2.`date` 
     BETWEEN UNIX_TIMESTAMP(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 48 HOUR)) 
     AND UNIX_TIMESTAMP(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 24 HOUR))
     ) 
     GROUP BY idMembre
    edit 2 : après 8min d’exécution, le serveur SQL à planté
    ca ressemble à une boucle infinie, mais je ne vois pas en quoi...

    edit 3 : j'ai ajouté un index sur le champ date et là c'est passé oO
    46 sec d'execution tout de même XD
    heureusement que maintenant que j'ai cette requete je vais pouvoir purger de temps en temps la table ^^
    Dernière modification par Invité ; 31/08/2010 à 12h33.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    edit 3 : j'ai ajouté un index sur le champ date et là c'est passé oO
    46 sec d'execution tout de même XD
    Quel est le volume de données ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Invité
    Invité(e)
    Par défaut
    300 000 entrées

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est vraiment peu pour un SGBD !

    Tu peux donner la structure de la table ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE TABLE md_donnees
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. requete sql tourne sans fin
    Par hammag dans le forum SQL
    Réponses: 10
    Dernier message: 03/12/2009, 18h59
  2. Sous requete de sous requete..(trop long)
    Par Thesum dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/10/2008, 10h12
  3. Optimisation requete avec sous-requetes multiples
    Par gege.boubou dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/09/2005, 10h42
  4. [UPDATE]Sous-requetes avec plusieurs nuplets
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/07/2005, 18h28
  5. INTERBASE: DELETE avec sous requete conditionnelle
    Par Papino dans le forum InterBase
    Réponses: 6
    Dernier message: 17/02/2005, 22h55

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