2016-05-04 2 views
6

Il mio obiettivo è quello di scoprire quanti dei visitatori che hanno inserito il mio sito Web negli ultimi 7 giorni, hanno visitato anche oggi. Ciò significa che se qualcuno ha visitato 05-02 e oggi lo conterà su 05-02.Come modificare la mia query per avere un risultato di fidelizzazione più accurato?

Il problema con la mia query è che se qualcuno ha visitato 05-01 e 05-02 e anche oggi, lo conterrà solo su 05-01. Ma voglio che la query lo contenga anche su 05-02.

Come posso modificare la query qui sotto per farlo?

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

Sarebbe utile per impostare qualcosa in http : //mysqlfiddle.com con alcuni dati di esempio. – miken32

+2

È difficile correggere la query senza sapere cosa contengono le tabelle, quindi aggiungi le descrizioni della tabella, alcuni dati di esempio (usa solo 1,2,3, ... per 'hash' e alcuni timestamp per entrambe le tabelle), e l'atteso risultato per questo. Se dovessi indovinare: 'audience' = elenco delle prime visite,' comportamento' = visite alle pagine di questi utenti?Quindi il tuo 'gruppo per viste 'prenderà la data della registrazione/prima visita (e quindi non differirà tra le date di visita) - probabilmente dovrai solo aggiungere" b.timestamp "al tuo" distinto "allora. Ma per favore basta aggiungere le informazioni mancanti, quindi non dobbiamo indovinare. – Solarflare

+0

Ciao, sei soddisfatto della mia risposta? Sarei felice di ricevere feedback da voi. – iLikeMySql

risposta

2

Per facilitare basta prendere tutte le persone che hanno visitato totay e cerca una visita negli ultimi 7 giorni e se ne viene trovato uno di ritorno l'ultima data di visita. Penso che questo approccio è più facile da comprendere:

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(); 
  • Ci uniamo in una selezione che già si compone di le informazioni necessarie (ultima visita per hash negli ultimi 7 giorni).

Il numero di righe restituito è il numero di visitatori che hanno visitato la pagina oggi e durante l'ultima settimana.

Si può anche contare dal vostro selezionare per ottenere il numero che stavi cercando come un risultato della query:

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

Puoi utilizzare semplicemente la funzione DATE - INTERVAL ? DAY. Esaminare l'esempio qui sotto:

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 

Vai qui per maggiori Date and Time Functions.

1

È anche possibile fare utilizzando DATE_SUB, controllare seguente query

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 

per maggiori informazioni visita seguente URL

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