2010-07-08 139 views
1

我有一个每小时运行的cron作业。mysql查询显示趋势的视图

cron作业将记录添加到表“更新”

table - 'update' 
update_id (primary) 
timestamp 

添加了一个记录,我的网站的每个页面分为表视图

table - 'views' 
page_id 
update_id 
view_count 

我寻找要实现的是一个查询,它可以将每个page_id之前的最新更新(最高update_id)与更新进行比较,并返回视图中的百分比增加。不能为我的生活让我的头靠近它。

以下是一些示例数据。

page_id = 1 
update_id = 10 
view_count = 1251 

page_id = 1 
update_id = 11 
view_count = 1349 
+0

“VIEWS.view_count”是一个增量(仅差异)还是总值?更好的是,提供示例数据:) – 2010-07-08 20:43:22

+0

查看计数是总价值。感谢:) – Pablo 2010-07-08 20:50:55

回答

1

你可能想尝试update_id - 1的加盟views表,如下面的查询:

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; 

测试案例:

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); 

结果:

+---------+--------------+----------------+------------+ 
| 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) 

注意trend_percNULL如果previous_count恰好是0

+0

似乎有一个错误,它是比较最近更新的所有page_id的前一行的第一行:s – Pablo 2010-07-08 21:01:35

+0

@Pablo:是的,我应该修正:)那里有' “JOIN”中缺少v2.page_id = v1.page_id'部分...请检查更新后的答案。 – 2010-07-08 21:02:56

0

我想你需要先聚集update表,所以,

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

那么你一定要与意见

SELECT * FROM views AS v1 ... 

...呃,等待加入。我想你错过了update表中的一列,不是吗? 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; 

那么你一定要与意见加入:

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 

还是这样...