2010-07-08 137 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 

還是這樣...