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
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.
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;
J'ai transformé la requête SQL de la manière suivante:
Requete 2
Et c'est là que je rencontre un problème
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;
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
Partager