MySQL COUNT DISTINCT

144

Estoy tratando de recopilar el número de visitas distintas en mi cp ayer, y luego contarlas.

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 alguna razón, esto está obteniendo múltiples resultados con la misma identificación del sitio ... ¿cómo solo extraigo y cuento los inicios de sesión de cp de site_id distintos?

Miguel
fuente

Respuestas:

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ᵀᴹ
fuente
17
Me encanta SQL porque recibes preguntas como "¿Cómo cuento los ID de usuario distintos?" Y la respuesta es solo " Count(Distinct user_id)"
Tim
23

En general

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

O por sitio

  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`

Tener la timecolumna en el resultado no tiene sentido, ya que está agregando las filas, mostrar una en particular timees irrelevante, a menos que sea la mino la maxque está buscando.

RichardTheKiwi
fuente
7

Necesita usar un grupo por cláusula.

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