2014-04-26 31 views
0

我有一個記錄某些應用程序數據的表。從表中獲取最新的數據,然後做一筆總計

它的結構類似於

CREATE TABLE `log` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `website_id` int(11) DEFAULT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `date` date DEFAULT NULL, 
    `pages` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1; 

數據

INSERT INTO `log` (`id`, `website_id`, `created_at`, `date`, `pages`) 
VALUES 
    (1,1,'2014-04-03 00:30:01','2014-04-03',30), 
    (2,2,'2014-04-03 12:21:54','2014-04-03',13), 
    (3,1,'2014-04-04 01:10:12','2014-04-04',40), 
    (4,2,'2014-04-04 01:11:53','2014-04-04',20), 
    (5,1,'2014-04-04 02:43:31','2014-04-04',5), 
    (6,1,'2014-04-05 12:29:48','2014-04-05',8), 
    (7,1,'2014-04-05 13:48:51','2014-04-05',0), 
    (8,2,'2014-04-05 14:01:26','2014-04-05',20), 
    (9,2,'2014-04-05 15:51:01','2014-04-05',30), 
    (10,3,'2014-04-05 17:29:30','2014-04-05',15); 

我想要做的是拉出來的一天每個網站的最新記錄,然後在執行一筆,所以我得到頁面列的總數。

因此期望3行

2014-04-03 | 43 
2014-04-04 | 25 
2014-04-05 | 45 

因此讓行時,它需要獲得與第一次創建的最新行的網站,所以這裏

(6,1,'2014-04-05 12:29:48','2014-04-05',8), 
(7,1,'2014-04-05 13:48:51','2014-04-05',0), 

ID 7將被用於,因爲它更新。 因此,對於2014年4月5日的網站ID 1將具有0的頁面數,而不是8

select date, sum(pages) from log group by date 

結果

2014-04-03 | 43 
2014-04-04 | 65 
2014-04-05 | 73 

它的出路,因爲它沒有過濾器,但我不是確定如何過濾這個。

+0

您是指'按日期排序desc'?你的sum()查詢似乎已經做到了你想要的 - 所有'pages'字段的總和,被分成了單獨的日子。 –

+0

我不確定你想要過濾什麼。您擁有的查詢將生成您需要的結果。 –

+0

你好,從我的問題「我想要做的是拉出每個網站的一天的最新記錄」 - 我上面的查詢只是總結所有的日期。請重新閱讀這個問題..如果一天內有兩個網站,那麼只有最新的記錄應該被計算在內。 – Wizzard

回答

1

試試這個:

SELECT L1.`date`, SUM(L1.`pages`) `pages` 
FROM `log` L1 
JOIN 
(
    SELECT `website_id`, MAX(`created_at`) as `created_at` 
    FROM `log` 
    GROUP BY `website_id`, `date` 
) L2 
ON L1.`website_id` = L2.`website_id` 
    AND L1.`created_at` = L2.`created_at` 
GROUP BY `date` 

SQL FIDDLE DEMO

0

在MySQL中,它往往是最快找到使用not exists的最新記錄。以下將log(website_id, date, created_at)上的索引效果最好:

select l.date, sum(l.pages) 
from log l 
where not exists (select 1 
        from log l2 
        where l2.website_id = l.website_id and 
         l2.date = l.date and 
         l2.created_at > l.created_at 
       ) 
group by l.date; 
+0

嗨,這似乎只讓我1回來,2014-04-05。但是,每個日期都會顯示一行(請參閱問題的預期) – Wizzard

+0

@Wizzard。 。 。對於那個很抱歉。我錯過了你想每天最近的一次,而不是最近的一般。 –

相關問題