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

Discussion dans 'Web, design' créé par natsou_k, 14 Mai 2007.

Statut de la discussion:
Fermée.
  1. Offline
    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.
    natsou_k, 14 Mai 2007
    #1
  2. Offline
    sfor Touriste
    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"
    sfor, 14 Mai 2007
    #2
  3. Offline
    natsou_k ex membre
    Déja essayé ca :-(
    natsou_k, 14 Mai 2007
    #3
  4. Offline
    natsou_k ex membre
    et il faut un group by car il s agit de fonctions d agrégation statistique (sum)
    natsou_k, 14 Mai 2007
    #4
  5. Offline
    SkYlEsS Kawai
    SkYlEsS, 15 Mai 2007
    #5
  6. Offline
    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 :)
    natsou_k, 15 Mai 2007
    #6
  7. Offline
    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.
    Shrekju, 15 Mai 2007
    #7
  8. Offline
    SkYlEsS Kawai
    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 fairedé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èmemets ton code stp ! [/B]  =]
    SkYlEsS, 15 Mai 2007
    #8
Statut de la discussion:
Fermée.