MySQL COUNT DISTINCT

144

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

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 de site ... comment puis-je extraire et compter uniquement les connexions cp site_id distinctes?

Mike
la source

Réponses:

299
 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
ypercubeᵀᴹ
la source
17
J'adore SQL parce que vous recevez des questions telles que "Comment puis-je compter les ID utilisateur distincts" et la réponse est simplement " Count(Distinct user_id)"
Tim
23

Global

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 timecolonne dans le résultat n'a pas de sens - puisque vous agrégez les lignes, en montrer un timen'est pas pertinent, à moins que ce ne soit le minou que maxvous soyez après.

RichardTheKiwi
la source
7

Vous devez utiliser une clause group by.

SELECT  site_id, MAX(ts) as TIME, count(*) group by site_id
Byron Whitlock
la source