MySQL COUNT DISTINCT


144

Ich versuche gestern, die Anzahl der verschiedenen Besuche in meinem CP zu erfassen und sie dann zu zählen.

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

Aus irgendeinem Grund werden dabei mehrere Ergebnisse mit derselben Site-ID abgerufen. Wie kann ich nur die unterschiedlichen CP-Anmeldungen für site_id abrufen und zählen?

Antworten:


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
Ich liebe SQL, weil Sie Fragen wie "Wie zähle ich unterschiedliche Benutzer-IDs" erhalten und die Antwort nur " Count(Distinct user_id)" lautet
Tim

23

Insgesamt

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

Oder pro 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`

Die timeSpalte im Ergebnis zu haben, macht keinen Sinn - da Sie die Zeilen aggregieren, timeist es irrelevant, eine bestimmte anzuzeigen, es sei denn, es ist die minoder maxSie suchen danach.


7

Sie müssen eine group by-Klausel verwenden.

SELECT  site_id, MAX(ts) as TIME, count(*) group by site_id
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.