2013-08-28 78 views
0

我有一張日期和用戶的表格。我需要幫助,試圖找出如何只計算前一日期後5天的日期。從前一天開始計算的日期的計數

id|users_id|date 
-------------------------------- 
1 | 1  | 2013-08-01 00:00:00 
2 | 2  | 2013-08-03 00:00:00 
3 | 1  | 2013-08-04 00:00:00 
4 | 1  | 2013-08-06 00:00:00 
5 | 2  | 2013-08-06 00:00:00 
6 | 2  | 2013-08-10 00:00:00 
7 | 2  | 2013-08-11 00:00:00 

通過下面的例子,我應該得到2用戶1和2的用戶2.我試圖做一個子查詢,但我無法在時間戳進行比較的通過。任何幫助將非常感激。謝謝。

這是我的一些示例查詢。

SELECT 
    tbl1.users_id, 
    COUNT(tbl2.date) 
FROM table tbl1 
LEFT JOIN table tbl2 
    ON tbl2.users_id = tbl1.users_id 
    AND tbl2.date > DATE_ADD(tbl1.date, INTERVAL 5 DAY) 
GROUP BY tbl1.users_id; 

SELECT 
    tbl1.users_id, 
    COUNT(tbl2.date) 
FROM table tbl1 
LEFT JOIN (
    SELECT users_id, date 
    FROM table 
    WHERE date > DATE_ADD(tbl1.date, INTERVAL 5 DAY) 
) tbl2 ON tbl1.users_id = tbl1.users_id 
GROUP BY tbl1.users_id; 

最後一種方法顯然不起作用,因爲我不能把tbl1的日期放在子查詢中。

+0

你嘗試過什麼SQL? –

+0

其實我在前一天的5天后不太明白你的意思?什麼是以前的日期? 根據您的查詢看來,用戶1返回0,用戶2返回3? – Jianhong

+0

上一個日期是上次用戶日期。例如,2013-08-01是2013-08-04的上一個日期。現在的問題是,如果2013-08-04是2013-08-01之後的5天,我只想計算一下。我會數2013-08-06。然後,我要計算2013-08-06之後至少5天的下一行。 –

回答

1

沒有測試,但是這樣的事情可能: -

SELECT tbl1.users_id, COUNT(tbl2.date) 
FROM (SELECT users_id, date, @Counter:=IF(users_id = @PrevId, @Counter + 1, 1) AS SequenceCtr, @PrevId:=users_id 
FROM atable 
CROSS JOIN (SELECT @Counter:=0, @PrevId:=0) Sub1 
ORDER BY users_id, date) AS tbl1 
LEFT OUTER JOIN (SELECT users_id, date, @Counter:=IF(users_id = @PrevId, @Counter + 1, 1) AS SequenceCtr, @PrevId:=users_id 
FROM atable 
CROSS JOIN (SELECT @Counter:=0, @PrevId:=0) Sub1 
ORDER BY users_id, date) AS tbl2 
ON tbl1.users_id = tbl2.users_id 
AND tbl1.SequenceCtr + 1 = tbl2.SequenceCtr 
AND tbl2.date > DATE_ADD(tbl1.date, INTERVAL 5 DAY) 
GROUP BY tbl1.users_id; 

情侶子查詢來獲取日期但增加了一個序列號列表。然後像你一樣加入,但也加入序列號爲1的地方。

編輯 - 對SQL搗鼓一個快速測試,它似乎工作: -

http://sqlfiddle.com/#!2/6c69b/1

+0

夥計,你是個天才!謝謝您的幫助! –

相關問題