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 DATE_SUB / INTERVAL et champ dynamique


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Requete avec DATE_SUB / INTERVAL et champ dynamique
    Bonjour à tous,

    Je suis actuellement en train de refaire un script SQL qui avait été fait par une autre personne à la base.
    La requête SQL était telle que :

    requete 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    EXPLAIN SELECT champ1, COUNT(champ2) AS champ2  
    FROM matable t1 
    WHERE t1.STATUS='1' 
    AND t1.DateGMT > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) 
    AND t1.IDPAY != 9
    GROUP BY t1.champ1;
    Or aujourd'hui nous souhaitons que la valeur de l'intervalle soit récupéré depuis une autre table et non plus en dur. Appellons cet intervalle champ_interval. Je l'ai donc stocké dans une autre table et ce champ est de type tinyint(1) UNSIGNED default 1.

    J'ai transformé la requête SQL de la manière suivante:
    Requete 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    EXPLAIN SELECT champ1, COUNT(champ2) AS champ2  
    FROM matable1 t1 
    INNER JOIN matable2 AS t2 ON (t2.champ3 = t1.champ3) 
    WHERE t1.STATUS='1' 
    AND t1.DateGMT > UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL champ_interval DAY)) 
    AND t1.IDPAY != 9
    GROUP BY t1.champ1;
    Et c'est là que je rencontre un problème
    En effet si je retourne le resultat des 2 explain j'ai ceci
    Requete 1 : key DateGMT / rows 1249
    Requete 2 : key Status / rows 2042725

    Et dans le second cas la requête ramène beaucoup beaucoup trop d'enregistrements.
    Je dois préciser que si je prend la même requete 2 et que je met 1 en dur à la place de champ_interval alors le nombre de lignes est correct. C'est dès que je met champ_interval que cela ne va plus.

    J'ai essayé de forcer l'index, de caster le champ, de ne plus passer par DATE_SUBS et INTERVAL ... rien n'y fait.

    Est ce que quelqu'un aurait une idée svp ?
    Ou est ce que je dois faire un script PHP plutot que full SQL parce que ce que je tente de faire n'est pas possible ?

    Merci de votre aide car là j'avoue je suis un perdue

  2. #2
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Personne n'a d'idée ou peut être ce que j'ai expliqué n'est pas compréhensible ?

    Merci

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    A priori, tout est correct. Ça me semble également normal qu'une requête WHERE date > aujourdhui - x jours ramène plus de lignes qu'une requête WHERE date > aujourdhui - 1 jour
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Et merci pour la réponse Je suis bien d'accord avec ta constatation.
    Le problème étant que dans ma requête le champ intreval est toujours égal à 1.
    La jointure que je fais avec matbale2 afin de récupérer le champ champ_interval est correct et tous les enregistrements de cette table ont une valeur de champ_interval=1.

    D'ou mon problème. Dans l'absolu les valeurs sont les mêmes (==1) mais si je met 1 en dur tout est ok, si je met champ_interval alors là cela ne va pas.

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    et avec 1 en dur mais en gardant ta jointure sur matable2 ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Ca ça fonctionne sans aucun souci. Ca me renvoie un nombre de lignes très correct et qui s'avère bon quand je vérifie manuellement dans SQL.
    Le problème intervient dès que je remplace le 1 en dur par champ_interval ... d'ou ma perplexité

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    et que te donne un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT DISTINCT champ_interval
    FROM matable2
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT F_SITE_GAMEPROG_INTERVAL FROM site
    Affichage des enregistrements 0 - 0 (1 total, traitement: 0.0031 sec.)
    F_SITE_GAMEPROG_INTERVAL
    1

    Donc il est toujours égal à 1

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

Discussions similaires

  1. Requete avec distinction de certains champs
    Par OLI03 dans le forum SQL
    Réponses: 1
    Dernier message: 13/02/2012, 10h20
  2. Requete avec disctinct sur certains champs
    Par zandeparis dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 11/12/2009, 14h57
  3. requete sur 2 tables liées avec même nom de champs
    Par Australia dans le forum Access
    Réponses: 5
    Dernier message: 02/02/2006, 11h38
  4. Pb de requete avec un champ vide ou pas
    Par linou dans le forum Langage SQL
    Réponses: 10
    Dernier message: 16/06/2005, 10h44
  5. Requete avec filtre sur un champ
    Par podz dans le forum Langage SQL
    Réponses: 7
    Dernier message: 09/02/2005, 14h37

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