2016-12-15 96 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那些中间人并不完全很好看,但我希望它会帮助你比分组日期

更多

我会建议使用日期与时间的详细信息,但它完全取决于你的数据的意义