MYSQL计数?

Dav*_*801 4 php mysql sql aggregation

我有一个像以下的mysql表:

id, visitorid, pageid
Run Code Online (Sandbox Code Playgroud)

当访问者访问网站时,它会将访问者ID和页面ID存储为一行.

我试图提取访问网站的访问者数量正好X次.(图表).所以有多少人只访问一页,有多少人访问2页...

到目前为止我有:

SELECT COUNT(visid),visid FROM vislog GROUP BY visid ORDER BY COUNT(visid) DESC
Run Code Online (Sandbox Code Playgroud)

但我不知道如何计算计数的下一部分.

是否可以作为mysql查询?

编辑:我已经添加了我的答案.

ype*_*eᵀᴹ 13

您可以将查询包装在另一个中:

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 ;
Run Code Online (Sandbox Code Playgroud)

或者(我认为将数字传递给图表更有意义),删除ORDER BY与放置相同的内容:

ORDER BY cnt ;
Run Code Online (Sandbox Code Playgroud)


rai*_*7ow 9

一种方法是将此查询包装到另一个中:

SELECT COUNT(visid) FROM (
    SELECT COUNT(visid) AS cvisid, visid 
      FROM vislog 
  GROUP BY visid 
  HAVING cvisid = 2) AS c
Run Code Online (Sandbox Code Playgroud)

但我认为你需要得到访问的直方图:这可以用PHP完成(假设查询与问题中的相同):

$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;
  }
}
Run Code Online (Sandbox Code Playgroud)

或者使用MySQL本身:

SELECT cvisid, 
       COUNT(cvisid) AS cnt 
  FROM (
    SELECT visid,
           COUNT(visid) AS cvisid 
      FROM vislog 
  GROUP BY visid ) AS c
GROUP BY cvisid
Run Code Online (Sandbox Code Playgroud)


Dav*_*801 -11

我可以这样解决:

SELECT cnt, COUNT(cnt) FROM (
    SELECT COUNT(visid) as cnt FROM vislog GROUP BY visid
) x GROUP BY cnt ORDER BY cnt ASC
Run Code Online (Sandbox Code Playgroud)

小事x很重要。

  • “x”称为别名。派生表(如本例所示)必须有一个别名。您可以使用“AS x”或仅使用“x”(“AS”是可选的)。它与我的答案中的“AS grp”和另一个答案中的“AS a”相同。 (6认同)
  • 我看不出这与 @ypercube 提供的答案有什么不同。 (2认同)