2016-12-15 94 views
0

我有一個表具有以下數據(僅是一個實例,實際的表具有60萬行)(援助=訪問ID [主鍵]和id =用戶ID [外鍵):如何根據日期返回新ID?

aid | id | date 
332 | 1 | 2016-12-15 
331 | 4 | 2016-12-15 
330 | 3 | 2016-12-15 
329 | 1 | 2016-12-14 
328 | 1 | 2016-12-14 
327 | 2 | 2016-12-14 
326 | 3 | 2016-12-13 
325 | 2 | 2016-12-13 
324 | 1 | 2016-12-13 
323 | 1 | 2016-12-12 
322 | 3 | 2016-12-12 
321 | 1 | 2016-12-12 

每個ID是一個用戶主鍵,每次他們訪問我係統中的某些東西時,我都將它們記錄在這張表中(日期格式如圖所示,以及它們的ID)。用戶可以每天登錄多次。

我期待的是:返回一天內訪問該事物的總次數,並返回在過去8天內訪問過該事物的新用戶的總數每天都會被記錄下來,所以使用「LIMIT 8」對於只有最後8天是可以的)。

我的SQL目前是這樣的:

SELECT COUNT(id), COUNT(distinct id), date 
FROM table 
GROUP BY date 
ORDER BY date DESC 
LIMIT 8; 

這SQL正確做的第一部分,但我無法弄清楚如何得到它的返回誰從來沒有訪問的東西,直到用戶數天。

期望的結果會是這樣,一個「NEWUSER」代表ID爲「4」的用戶,因爲他們從來沒有訪問之前的事情:

COUNT(id) | newusers | date 
3   | 1   | 2016-12-15 
3   | 0   | 2016-12-14 
3   | 0   | 2016-12-13 
3   | 0   | 2016-12-12 

很抱歉,如果我沒有解釋不夠這一點。

+0

那麼它應該顯示'2'的'12-12-2016'和'1'爲'13-12-2016',因爲它們是第一次訪問,對吧? –

+0

(除非日期真的是日期時間),您沒有PRIMARY KEY,這可能會在適當的時候出現問題。 – Strawberry

+0

雖然用戶1,2和3在12-12-2016之前都已經訪問過。 – Enstage

回答

1

吸引新用戶,你要在第一天的ID出現:

select id, min(date) 
from t 
group by id; 

剩下的只是一個joingroup by

select d.date, cnt, count(dd.id) as newusers 
from (select date, count(*) as cnt 
     from t 
     group by date 
    ) d left join 
    (select id, min(date) as mindate 
     from t 
     group by id 
    ) dd 
    on d.date = dd.mindate 
group by d.date, d.cnt 
limit 8; 
+0

感謝您的解決方案!我認爲你的意思是「group by」,而不是在第二行中的「order by」 - 通過改變它爲驚人的作品。 – Enstage

+0

@Enstage。 。 。對就這樣。 –

1

得到你需要給他們在最近8天的與一組ID的新用戶數量

我的MySQL是一個有點生疏了,所以你可能需要更正語法。

SELECT COUNT(id) 
FROM table 
WHERE id NOT IN (
    SELECT DISTINCT id 
    FROM table 
    WHERE date BETWEEN DATE(DATE_SUB(NOW(), INTERVAL 8 DAY)) AND DATE(DATE_SUB(NOW(), INTERVAL 1 DAY)) 
) 

我會離開它,因爲你把它與其他查詢合併任務;)

1

嗨,如果在數據庫中的日期欄,是表示你可以做一些格式的日期時間/日期或其他日期像這樣:

爲讓誰8天內訪問所有的東西用戶:

Select id, date from table 
where date BETWEEN DATE_ADD(NOW(), INTERVAL -9 DAY) AND NOW() 

我想,你可以做你想做的,無論分組。 要獲得新的用戶,你可以自去參加或子選擇

selfjoin:

select t.id, t.date from table as t 
LEFT join table as t2 
    ON t.id = t2.id 
    AND t.date BETWEEN DATE_ADD(NOW(), INTERVAL -1 DAY) AND NOW() 
    AND t2.date NOT BETWEEN DATE_ADD(NOW(), INTERVAL -9 DAY) AND NOW() 
WHERE t2.id IS NULL 

我用左加入以匹配用戶的所有訪問,然後在排除這些行。然而自連接是緩慢的,甚至與左慢加盟

子查詢:

select id, date from table 
where date BETWEEN DATE_ADD(NOW(), INTERVAL -1 DAY) AND NOW() 
AND id NOT IN ( 
    SELECT id FROM table 
    WHERE date BETWEEN DATE_ADD(NOW(), INTERVAL -2 DAY) AND DATE_ADD(NOW(), INTERVAL -1 DAY) 
) 

我知道有date_adds那些中間人並不完全很好看,但我希望它會幫助你比分組日期

更多

我會建議使用日期與時間的詳細信息,但它完全取決於你的數據的意義