如何编辑我的查询以获得更准确的用户保留结果?

vil*_*oui 6 mysql

我的目标是找到在过去7天内访问我网站的访问者中有多少人今天也访问过.这意味着如果有人访问过05-02,今天,它会计算在内05-02.

我的查询的问题是,如果有人访问过05-01,05-02而且今天也是如此05-01.但是我希望查询能够统计他05-02.

如何编辑下面的查询来执行此操作?

SELECT COUNT( DISTINCT v.`hash` ) hashCount, DATE( v.`timestamp` ) AS views
FROM audience v
INNER JOIN behaviour b ON v.`hash` = b.`hash` 
WHERE v.timestamp
BETWEEN SUBDATE( CURDATE( ) , 7 ) 
AND CURDATE( ) 
AND DATE( b.timestamp ) = CURDATE( ) 
GROUP BY views
Run Code Online (Sandbox Code Playgroud)

iLi*_*Sql 2

为了方便起见,只需将所有访问过的人都记录下来,查找过去 7 天内的访问情况,如果找到,则返回最后一次访问的日期。我认为这种方法更容易理解:

select b.`hash` ,  
       audience.last_visit 
from behaviour b
 inner join (select v.`hash`, max(v.timestamp) as last_visit from audience v
  where DATE(v.timestamp) between date_sub(current_date, interval 7 day) and 
  date_sub(current_date, interval 1 day)  
  group by v.`hash`) as audience 
 on(b.`hash` = audience.`hash`)
where DATE(b.timestamp) = CURDATE();
Run Code Online (Sandbox Code Playgroud)
  • 我们加入一个已经包含我们需要的信息的选择(过去 7 天内每个哈希的最新访问)。

返回的行数是今天和上周访问您页面的访问者数量。

您还可以从您的选择中进行计数,以获取您要查找的数字作为查询结果:

select count(*) from    
(select b.`hash` ,  
       audience.last_visit 
from behaviour b
 inner join (select v.`hash`, max(v.timestamp) as last_visit from audience v
  where DATE(v.timestamp) between date_sub(current_date, interval 7 day) and 
  date_sub(current_date, interval 1 day)  
  group by v.`hash`) as audience 
 on(b.`hash` = audience.`hash`)
where DATE(b.timestamp) = CURDATE() ) as my_visitors;
Run Code Online (Sandbox Code Playgroud)

- 测试数据

    drop table if exists your_schema.behaviour;
    create table your_schema.behaviour(`hash` varchar(255), `timestamp` timestamp) ;

    insert into your_schema.behaviour
    values ('ab','2016-05-23'),('ac','2016-05-23');

    drop table if exists your_schema.audience;
    create table your_schema.audience (`hash` varchar(255), `timestamp` timestamp) ;
insert into your_schema.audience
values ('ab','2016-05-01'),('ab','2016-05-02'),('ab','2016-05-03'),('ab','2016-05-04'),('ab','2016-05-21'),('ab','2016-05-23'),
       ('ac','2016-05-01'),('ac','2016-05-02'),('ac','2016-05-03'),('ac','2016-05-04'),('ac','2016-05-21'),('ac','2016-05-23'),
       ('ad','2016-05-01'), ('ad','2016-05-02'), ('ad','2016-05-03'),('ad','2016-05-04'),('ad','2016-05-21'),('ad','2016-05-23');
Run Code Online (Sandbox Code Playgroud)