2011-04-20 4 views
107

J'essaie de collecter le nombre de visites distinctes dans mon cp hier, puis les compter.MySQL COUNT DISTINCT

SELECT 
    DISTINCT `user_id` as user, 
    `site_id` as site, 
    `ts` as time 
FROM 
    `cp_visits` 
WHERE 
    ts >= DATE_SUB(NOW(), INTERVAL 1 DAY) 

Pour une raison quelconque cela tire plusieurs résultats avec le même identifiant du site .... Comment puis-je tirer et ne compte les connexions distinctes site_id cp?

Répondre

229
Select 
    Count(Distinct user_id) As countUsers 
    , Count(site_id) As countVisits 
    , site_id As site 
From cp_visits 
Where ts >= DATE_SUB(NOW(), INTERVAL 1 DAY) 
Group By site_id 
7

Vous devez utiliser une clause group by.

SELECT site_id, MAX(ts) as TIME, count(*) group by site_id 
17

Dans l'ensemble

SELECT 
     COUNT(DISTINCT `site_id`) as distinct_sites 
    FROM `cp_visits` 
WHERE ts >= DATE_SUB(NOW(), INTERVAL 1 DAY) 

ou par site

SELECT 
     `site_id` as site, 
     COUNT(DISTINCT `user_id`) as distinct_users_per_site 
    FROM `cp_visits` 
    WHERE ts >= DATE_SUB(NOW(), INTERVAL 1 DAY) 
GROUP BY `site_id` 

Avoir la time colonne dans le résultat n'a pas de sens - puisque vous agrégeant les lignes, montrant un time n'est pas pertinent, à moins que ce soit min ou max vous êtes après.