2010-07-08 6 views
1

J'ai un travail cron qui s'exécute toutes les heures.mysql une requête pour afficher la tendance dans les vues

Le travail cron ajoute un enregistrement à la table 'mise à jour'

table - 'update' 
update_id (primary) 
timestamp 

et

ajoute un enregistrement pour chaque page de mon site en vue de la table

table - 'views' 
page_id 
update_id 
view_count 

Ce que je suis à la recherche à réaliser est une requête qui peut comparer la mise à jour la plus récente (le plus haut update_id) à la mise à jour avant pour chaque page_id et retourner un pourcentage d'augmentation des vues. Je ne peux pas pour la vie de ma tête autour de moi.

Voici quelques exemples de données.

page_id = 1 
update_id = 10 
view_count = 1251 

page_id = 1 
update_id = 11 
view_count = 1349 
+0

Est-ce que 'VIEWS.view_count' est un delta (seulement la différence) ou la valeur totale? Mieux encore, fournissez des exemples de données :) –

+0

Le nombre de vues est la valeur totale. Merci :) – Pablo

Répondre

1

Vous pouvez essayer la joindre à la table views sur update_id - 1, comme dans la requête suivante:

SELECT v1.page_id, 
      v1.view_count latest_count, 
      v2.view_count previous_count, 
      (1 - v2.view_count/v1.view_count) * 100 trend_perc 
FROM  views v1 
JOIN  views v2 ON (v2.update_id = v1.update_id - 1 AND 
         v2.page_id = v1.page_id) 
WHERE  v1.update_id = (SELECT MAX(update_id) FROM `views`) 
GROUP BY v1.page_id 
ORDER BY page_id; 

cas de test:

CREATE TABLE `updates` (update_id int, timestamp datetime); 
CREATE TABLE `views` (page_id int, update_id int, view_count int); 

INSERT INTO `updates` VALUES (1, '2010-07-08 12:00:00'); 
INSERT INTO `updates` VALUES (2, '2010-07-08 13:00:00'); 
INSERT INTO `updates` VALUES (3, '2010-07-08 14:00:00'); 

INSERT INTO `views` VALUES (1, 1, 100); 
INSERT INTO `views` VALUES (2, 1, 50); 
INSERT INTO `views` VALUES (3, 1, 75); 
INSERT INTO `views` VALUES (1, 2, 150); 
INSERT INTO `views` VALUES (2, 2, 90); 
INSERT INTO `views` VALUES (3, 2, 80); 
INSERT INTO `views` VALUES (1, 3, 175); 
INSERT INTO `views` VALUES (2, 3, 115); 
INSERT INTO `views` VALUES (3, 3, 120); 

Résultat:

+---------+--------------+----------------+------------+ 
| page_id | latest_count | previous_count | trend_perc | 
+---------+--------------+----------------+------------+ 
|  1 |   175 |   150 | 14.2857 | 
|  2 |   115 |    90 | 21.7391 | 
|  3 |   120 |    80 | 33.3333 | 
+---------+--------------+----------------+------------+ 
3 rows in set (0.00 sec) 

Notez que trend_perc sera NULL si le previous_count se trouve être 0.

+0

Il semble y avoir une erreur en ce sens qu'il compare tous les page_id de la mise à jour la plus récente à la première ligne de l'avant: s – Pablo

+0

@Pablo: Oui, j'aurais dû régler cela :) Il y avait le ' v2.page_id = v1.page_id' partie manquante dans 'JOIN' ... Veuillez vérifier la réponse mise à jour. –

0

Je suppose que vous avez besoin d'agréger la première table update, donc,

SELECT COUNT(*) AS cnt FROM `update` WHERE update_id = (SELECT MAX(update_id) FROM `update`) GROUP BY page_id; 

alors vous voulez une jointure avec vue

SELECT * FROM views AS v1 ... 

... euh, attendez. Je pense qu'il vous manque une colonne dans la table update, n'est-ce pas? Le page_id.

CREATE TEMPORARY TABLE vTemp 
SELECT page_id, COUNT(*) AS cnt FROM `update` WHERE update_id = (SELECT MAX(update_id) FROM `update`) GROUP BY page_id; 

Ensuite, vous voulez une jointure avec vue:

SELECT 1 - (v1.view_count/vTemp.cnt) AS difference FROM views AS v1 
    LEFT OUTER JOIN vTemp AS v2 USING(page_id) 
WHERE v1.update_id = (SELECT MAX(update_id)-1 FROM `update`) GROUP BY page_id 

Ou comme ...

Questions connexes