requete complexe sur deux tables (calcul de différence sur les champs d une meme tab)

Statut
N'est pas ouverte pour d'autres réponses.
N

natsou_k

ex membre
Bonjour, j'ai un petit soucis avec une requete que je fais sur deux tables.
Pourriez vous m aider svp?

voici mes deux table :

T_blog_blog
->id_blog
->nomdublog

T_blog_visites
->id_blog
->visites
->date

La deuxieme table comporte le nombre de visiteur par jours qu il y a eu sur les blogs.
Je veux en fait calculer l augmentation du nombre de visiteurs des 7 derniers jours en fonction des 7 jours précédent ces 7 derniers jours.

Je pense avoir deja bien construit ma requete mais le resultat n est pas bon :

voici ma requete :

select (sum(t2a.visites) - sum(t2b.visites)) as resultat,
t2a.id_blog,
sum(t2a.visites),
sum(t2b.visites),
t2a.id_blog,
t2b.id_blog
from T_blog_visites as t2a, T_blog_visites as t2b
where
(t2a.date<=CURRENT_DATE() and t2a.date>ADDDATE(CURRENT_DATE(), INTERVAL -7 DAY))
and
(t2b.date<=ADDDATE(CURRENT_DATE(), INTERVAL -7 DAY) and t2b.date>ADDDATE(CURRENT_DATE(), INTERVAL -15 DAY))
group by t2a.id_blog,t2b.id_blog
order by resultat desc



et voici le resultat :

4 6 12 8 6 6
0 9 2 2 9 6
-1 14 1 2 14 6
-1 11 1 2 11 6



On remarque que t2b.id_blog vaut toujours 6 alors qu'il devrait valoir 6 puis 9 puis 14 et en suite 11.

voici le contenu de ma table T_blog_visite :

Code:

id_blog visites date
6 2 2007-05-04
6 1 2007-05-08
6 9 2007-05-09
6 1 2007-05-10
6 1 2007-05-11
9 2 2007-05-12
14 1 2007-05-12
11 1 2007-05-12


Donc en toute logique il n y a que le blog 6 qui devrait avoir 12 visites ces 7 derniers jours mois, 2 visites les jours d avant. ce qui fait une augmentation de 10 et pas de 4 :s

Je vous remercie d avance pour votre aide.
 

sfor

Elite
Tu dois faireun jointure, pas un produit: quelque chose comme "FROM t_blog_blog INNER JOIN T_blog_visites ON T_blog_blog.blog.id_blog = T_blog_visites.id_blog"
 
1er
OP
N

natsou_k

ex membre
Déja essayé ca :-(
 
1er
OP
N

natsou_k

ex membre
natsou_k a dit:
Déja essayé ca :-(
et il faut un group by car il s agit de fonctions d agrégation statistique (sum)
 
1er
OP
N

natsou_k

ex membre
Salut, en fait j ai trouvé la :)
J ai utilisé les vue de mysql
et j ai fais une jointure sur les deux vues :)
Merdi quand ememe :)
 
S

Shrekju

ex membre
Je ne vois pas trop pquoi tu fais une auto-jointure..
A premiere vue, je me lancerais plutot vers les requetes imbriquées..

edit: ok, apparement tu preferes la solution de barbar tant que ca marche.
 

SkYlEsS

Elite
Avec ceci :

Code:
CREATE TABLE `T_blog_visites` (
  `id_blog` smallint(5) unsigned NOT NULL default '0',
  `visites` smallint(5) unsigned NOT NULL default '0',
  `date` date NOT NULL default '0000-00-00'
) TYPE=MyISAM;

-- 
-- Contenu de la table `T_blog_visites`
-- 

INSERT INTO `T_blog_visites` VALUES (6, 2, '2007-04-04');
INSERT INTO `T_blog_visites` VALUES (14, 1, '2007-05-12');
INSERT INTO `T_blog_visites` VALUES (6, 1, '2007-05-08');
INSERT INTO `T_blog_visites` VALUES (11, 1, '2007-05-12');
INSERT INTO `T_blog_visites` VALUES (6, 9, '2007-05-09');
INSERT INTO `T_blog_visites` VALUES (6, 1, '2007-05-10');
INSERT INTO `T_blog_visites` VALUES (6, 1, '2007-05-11');
INSERT INTO `T_blog_visites` VALUES (9, 2, '2007-05-12');
J'ai donc une seule entrée sur le mois précédent. (2 visites du blog 6)

On exécute 2 requêtes (si une seule, y a multiplication d'une entrée à toutes les autres entrées ==> le résultat de la seconde requête est multipliée à chaque entrée. Ainsi, le résultat retourne 2 pour le blog 6. Si une seule requêtes, 3 entrées pour l'id 6 = 3x2 = 6 ! Et toutes les autres sont à 2. Voilà ce qui foire mais j'avoue ne pas avoir trouvé comment résoudre ce problème. Faudrait qu'il fasse correspondre le résultat seulement à l'id commune et une seule fois !)

Code:
SELECT SUM( visites ) AS resultat, id_blog 
FROM T_blog_visites 
WHERE date <= CURRENT_DATE( )
AND date > SUBDATE( CURRENT_DATE( ) , INTERVAL 7 DAY )
GROUP BY id_blog 
ORDER BY resultat DESC
Retourne :

resultat id_blog
11 6
2 9
1 14
1 11


Code:
SELECT SUM( visites ) AS resultat, id_blog  
FROM T_blog_visites 
WHERE date <= SUBDATE( CURRENT_DATE( ) , INTERVAL 1 MONTH )
AND date > SUBDATE( CURRENT_DATE( ) , INTERVAL 2 MONTH )
GROUP BY id_blog 
ORDER BY resultat DESC
Retourne :

resultat id_blog
2 6

PHP:
 Suffit alors de soustraire le résultat de la seconde requête où l'id_blog correspond à la première requête. Ensuite, on affiche le résultat pour chaque id_blog.

'Peut pô mieux faire, désolé  :] 

Quelqu'un d'autre à une idée ?

EDIT : ça fait 2 heures que je cherche une solution comme un gland alors qu'il a trouvé ...  :| 

[B]Ca m'intéresse de savoir comment tu as solutionné ton problème, mets ton code stp ! [/B]  =]
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut