2016-05-04 2 views
6

Mein Ziel ist es zu finden, wie viele der Besucher, die meine Website während der letzten 7 Tage betreten haben, auch heute besucht haben. Das bedeutet, wenn jemand 05-02 besucht hat und heute, wird es auf 05-02 zählen.Wie bearbeite ich meine Abfrage, um ein genaueres Benutzererhaltungsergebnis zu erhalten?

Das Problem mit meiner Abfrage ist, dass, wenn jemand 05-01 und 05-02 und auch heute besuchte, wird es ihn nur auf 05-01 zählen. Aber ich möchte die Abfrage auch auf 05-02 zählen.

Wie kann ich die Abfrage unten bearbeiten, um dies zu tun?

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

Es wäre hilfreich sein, etwas unter http einrichten : //mysqlfiddle.com mit einigen Beispieldaten. – miken32

+2

Es ist schwierig, die Abfrage zu korrigieren, ohne zu wissen, was die Tabellen enthalten. Fügen Sie also die Tabellenbeschreibungen, einige Beispieldaten (verwenden Sie einfach 1,2,3, ... für 'Hash' und einige Zeitstempel für beide Tabellen) und die erwarteten hinzu Ergebnis dafür. Wenn ich raten müsste: "Publikum" = Liste der ersten Besuche, "Verhalten" = Seitenbesuche dieser Nutzer?Dann nimmt Ihre 'Gruppe nach Ansichten' das Datum der Registrierung/des ersten Besuchs an (und unterscheidet sich somit nicht zwischen Besuchsdaten) - Sie müssen wahrscheinlich nur' b.timestamp' zu Ihrer 'distinct' dann hinzufügen. Aber bitte fügen Sie einfach die fehlenden Informationen hinzu, damit wir nicht raten müssen. – Solarflare

+0

Hallo, bist du mit meiner Antwort zufrieden? Ich würde mich freuen, Feedback von Ihnen zu erhalten. – iLikeMySql

Antwort

2

Um es einfach alle Menschen nehmen zu erleichtern, die totay besucht und suchen Sie nach einen Besuch in den letzten 7 Tagen und wenn man Rückkehr der letzte Tag der Besuch gefunden. Ich denke, dieser Ansatz ist einfacher zu verstehen:

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(); 
  • wir eine Auswahl kommen, dass die Informationen besteht bereits von uns (letzten Besuch pro Hash während der letzten 7 Tage) benötigen.

Die Anzahl der Zeilen ist die Zahl der Besucher zurück, die Ihre Seite heute besucht und während der letzten Woche.

Sie können auch von Ihrem wählen Sie zählen die Anzahl Sie suchen als Abfrageergebnis zu erhalten:

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

Sie können Verwenden Sie einfach die DATE - INTERVAL ? DAY Funktion. Untersuchen Sie die Probe unter:

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 

hier gehen für mehr Date and Time Functions.

1

können Sie auch tun, mit DATE_SUB, überprüfen Abfrage nach

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 

Weitere Informationen finden Sie unter folgender URL

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

Verwandte Themen