MySQL COUNT DISTINCT


144

Estou tentando coletar o número de visitas distintas no meu PC ontem e depois contá-las.

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

Por alguma razão, isso está gerando vários resultados com o mesmo ID de site .... como faço para extrair e contar apenas os logins distintos de site_id cp?

Respostas:


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

17
Adoro o SQL porque você recebe perguntas como "Como conto identificações de usuário distintas" e a resposta é apenas " Count(Distinct user_id)" #
1155 Tim Tim

23

No geral

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

Ou por 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`

Ter a timecoluna no resultado não faz sentido - desde que você está agregando as linhas, mostrando um particular timeé irrelevante, a menos que seja o minou maxvocê está depois.


7

Você precisa usar um grupo por cláusula.

SELECT  site_id, MAX(ts) as TIME, count(*) group by site_id
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.