MYSQL count of count?

2019-01-25 23:17发布

I have a mysql table like:

id, visitorid, pageid

When a visitor hits the website it stores their visitor id and the page id as a row.

I am trying to extract the number of visitors who hit the website exactly X times. (for a chart). so how many visit just one page, how many visit 2 pages...

so far I have:

SELECT COUNT(visid),visid FROM vislog GROUP BY visid ORDER BY COUNT(visid) DESC

But I don't know how to do the next part of counting the counts.

Is it possible to do as a mysql query?

Edit: I have added my answer.

5条回答
Bombasti
2楼-- · 2019-01-25 23:41

I could solve it this way:

SELECT cnt, COUNT(cnt) FROM (
    SELECT COUNT(visid) as cnt FROM vislog GROUP BY visid
) x GROUP BY cnt ORDER BY cnt ASC

The little x is important.

查看更多
干净又极端
3楼-- · 2019-01-25 23:48

Raina77ow (2nd reply) returned a clean solution in his third block of code

    SELECT cvisid, 
           COUNT(cvisid) AS cnt 
      FROM (
        SELECT visid,
               COUNT(visid) AS cvisid 
          FROM vislog 
      GROUP BY visid ) AS c
    GROUP BY cvisid

thank you

查看更多
Emotional °昔
4楼-- · 2019-01-25 23:50

You can wrap your query inside another one:

SELECT
    cnt      AS page_visits
  , COUNT(*) AS number_of_visitors
FROM
    ( SELECT 
          COUNT(*) AS cnt                --- use: COUNT(DISTINCT page_id)
                                         --- for a different count
      FROM vislog 
      GROUP BY visid
   ) AS grp
GROUP BY cnt 
ORDER BY number_of_visitors ;

or (I suppose this makes more sense for passing the numbers to a chart), remove the ORDER BY which is the same as putting:

ORDER BY cnt ;
查看更多
太酷不给撩
5楼-- · 2019-01-25 23:53

Try using following query

SELECT COUNT(a.page_visits) AS no_of_visitors, a.page_visits AS page_count
FROM(
SELECT COUNT(DISTINCT pageid) AS page_visits
FROM vislog
GROUP BY visid) AS a
GROUP BY a.page_visits;

Hope it helps...

查看更多
姐就是有狂的资本
6楼-- · 2019-01-26 00:05

One way to do it is to wrap this query into another one:

SELECT COUNT(visid) FROM (
    SELECT COUNT(visid) AS cvisid, visid 
      FROM vislog 
  GROUP BY visid 
  HAVING cvisid = 2) AS c

But I think you need to get the histogram of visits: this can be done with PHP (assuming the query is the same as in the question):

$results = array();
// query preparation skipped, as it's obviously done by the OP himself
while ($row = $sth->fetch()) {
  $count = $row['cvisid'];
  if (isset($results[$count])) {
    $results[$count]++;
  }
  else {
    $results[$count] = 1;
  }
}

Or with MySQL itself:

SELECT cvisid, 
       COUNT(cvisid) AS cnt 
  FROM (
    SELECT visid,
           COUNT(visid) AS cvisid 
      FROM vislog 
  GROUP BY visid ) AS c
GROUP BY cvisid
查看更多
登录 后发表回答