2016-05-04 2 views
6

Моя цель - узнать, сколько посетителей посетило мой сайт за последние 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 
+0

Было бы полезно, чтобы создать что-то по адресу : //mysqlfiddle.com с некоторыми примерами данных. – miken32

+2

Трудно исправить ваш запрос, не зная, что содержат таблицы, поэтому добавьте описания таблиц, некоторые примеры данных (просто используйте 1,2,3, ... для 'hash' и некоторые временные метки для обеих таблиц) и ожидаемые результат для этого. Если бы мне пришлось угадать: 'аудитория' = список первых посещений,' behaviour' = посещения страниц этих пользователей?Затем ваша группа «по видам» займет дату регистрации/первого посещения (и, следовательно, не будет отличаться от дат посещения) - вам, вероятно, просто нужно добавить 'b.timestamp' в ваш' distinct' тогда. Но, пожалуйста, просто добавьте недостающую информацию, поэтому нам не нужно гадать. – Solarflare

+0

Привет, вы удовлетворены моим ответом? Я был бы рад получить от вас обратную связь. – iLikeMySql

ответ

2

Чтобы было легче просто взять всех людей, побывавших totay и искать посетить в течение последних 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(); 
  • Мы присоединяемся на выбор, который уже состоит из информации, нам нужно (последнее посещение в хэш в течение последних 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; 

- Testdata

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'); 
0

Вы можете просто используйте функцию DATE - INTERVAL ? DAY. Осмотрите образец ниже:

SELECT COUNT(DISTINCT v.`hash`) AS hashCount, DATE(v.`timestamp`) AS views 
FROM audience v 
INNER JOIN behaviour b ON v.`hash` = b.`hash` 
WHERE views >= DATE(NOW()) - INTERVAL 7 DAY 
GROUP BY views 

Перейти здесь более Date and Time Functions.

1

Вы также можете сделать с помощью DATE_SUB, проверьте следующий запрос

SELECT COUNT(DISTINCT v.`hash`) AS hashCount, DATE(v.`timestamp`) AS views 
FROM audience v 
INNER JOIN behaviour b ON v.`hash` = b.`hash` 
WHERE views >= DATE_SUB(Now(),INTERVAL 7 DAY) 
GROUP BY views 

для получения дополнительной информации посетите следующий URL

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

Смежные вопросы