2016-05-04 12 views
6

Moim celem jest sprawdzenie, ilu użytkowników, którzy odwiedzili moją witrynę w ciągu ostatnich 7 dni, również odwiedziło ją dzisiaj. Oznacza to, że jeśli ktoś odwiedzi 05-02, a dziś będzie liczył na 05-02.Jak edytować moje zapytanie, aby uzyskać dokładniejszy wynik zatrzymania użytkownika?

Problem z moim zapytaniem dotyczy tego, że jeśli ktoś odwiedził 05-01 i 05-02, a także dzisiaj, będzie go liczyć tylko na 05-01. Ale chcę, aby zapytanie również liczyło się z nim na 05-02.

Jak mogę edytować poniższe pytanie, aby to zrobić?

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

Dobrze byłoby, aby ustawić coś na http : //mysqlfiddle.com z przykładowymi danymi. – miken32

+2

Trudno jest naprawić zapytanie bez znajomości zawartości tabel, dodaj więc opisy tabel, niektóre przykładowe dane (po prostu użyj 1,2,3, ... dla "hash" i niektórych znaczników czasu dla obu tabel), a oczekiwane wynik za to. Gdybym musiał zgadywać: 'audience' = lista pierwszych odwiedzin,' behaviour' = odwiedziny stron tych użytkowników?Wtedy twoja "grupa przez poglądy" przyjmie datę rejestracji/pierwszej wizyty (a zatem nie będzie się różnić między datami odwiedzin) - prawdopodobnie musisz po prostu dodać 'b.timestamp' do twojego' odrębnego'. Ale proszę dodaj brakujące informacje, więc nie musimy zgadywać. – Solarflare

+0

Witam, czy jesteś zadowolony z mojej odpowiedzi? Byłbym wdzięczny za otrzymanie informacji zwrotnej od ciebie. – iLikeMySql

Odpowiedz

2

Aby łatwiej po prostu wziąć wszystkie osoby, które odwiedziły totay i szukać wizytę w ciągu ostatnich 7 dni i jeśli je znajdzie powrót ostatnia data wizyty. Myślę, że takie podejście jest łatwiejsze do zrozumienia:

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(); 
  • Łączymy na select, który już składa się z informacji potrzebujemy (ostatnia wizyta za hash w ciągu ostatnich 7 dni).

liczba wierszy zwracanych jest liczba użytkowników, którzy odwiedzili stronę dziś i w ciągu ostatniego tygodnia.

Można również liczyć ze swoją wybierz, aby uzyskać liczbę czego szukasz w wyniku zapytania:

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

Można po prostu użyj funkcji DATE - INTERVAL ? DAY. Zbadać próbki poniżej:

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 

Przejdź tutaj więcej Date and Time Functions.

1

Można również zrobić za pomocą DATE_SUB, sprawdź następujące zapytanie

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 

więcej informacji na następujący adres URL

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

Powiązane problemy